pairs
Definition
-- @/=[C]:-1
function pairs(...)
Callers
@/inspector/Models/Cookie.js
// Set-Cookie: = ( ";" SP )*?
// NOTE: Some attributes can have pairs (e.g. "Path=/"), some are only a
// single word (e.g. "Secure").
@/lua/ge/extensions/util/terrainGenerator.lua
local blanks = 0
for k, v in pairs(self.materialsToTextureMaps) do
if not v then -- if material to texture map entry is still false
@/lua/ge/extensions/flowgraph/nodes/vehicle/randomConfigProvider.lua
}
for _, c in pairs(v.configs) do
if c["Top Speed"] and c["Top Speed"] > 10 then
@/lua/ge/extensions/gameplay/traffic/trafficUtils.lua
local valid = true
for k, v in pairs(filters) do -- optional filters by traffic vehicle properties
if veh[k] ~= nil and veh[k] ~= v then
@/lua/ge/extensions/gameplay/missions/proceduralMissionGenerators/busModeMissions.lua
local hasData = false
for _, file in pairs(busLineFiles) do
local busLine = jsonReadFile(file)
local busLine = jsonReadFile(file)
for _, route in pairs(busLine.routes) do
-- we save the data per route. route key is unfortunately a composite key of id and variance :(
@/lua/vehicle/controller/lineLock.lua
wheelNamesString = ""
for _, v in pairs(jbeamData.lockedLines or {}) do
lockedLines[v] = true
@/lua/vehicle/extensions/mqttGrafanaDemo.lua
for _, wd in pairs(wheels.wheels) do
local name = wd.name
@/lua/ge/extensions/editor/flowgraph/nodePreview.lua
for id, node in pairs(self.hover.nodes) do
ui_flowgraph_editor.SetCurrentEditor(self.fgEditor.ectx)
for _, link in pairs(self.hover.links) do
link:draw()
@/lua/ge/extensions/editor/flowgraph/missionVariableHelper.lua
local notFound = 0
for name, value in pairs(missionTypeData) do
if mgr.variables:variableExists(name) then
@/lua/ge/extensions/editor/dynamicDecals/settings.lua
materialsMapMaterialIdxToMaterialName = {}
for materialId, materialName in pairs(mNames) do
materialsMapMaterialNameToMaterialIdx[materialName] = materialId
for name, id in pairs(materialsMapMaterialNameToMaterialIdx) do
if im.ImGuiTextFilter_PassFilter(materialsFilter, name) then
local i = 0
for name, enabled in pairs(sMeshes) do
if im.ImGuiTextFilter_PassFilter(meshesFilter, name) then
local textureResolution = api.getTextureResolution()
for k,v in pairs(api.textureResolutions) do
if textureResolution.x == v.value then
@/lua/vehicle/controller/gauges/customModules/electricMotorData.lua
motors = powertrain.getDevicesByType("electricMotor")
for _, v in pairs(motors) do
for _, j in pairs(v.registeredEnergyStorages) do
for _, v in pairs(motors) do
for _, j in pairs(v.registeredEnergyStorages) do
table.insert(batteries, j)
@/lua/ge/extensions/flowgraph/nodes/states/transitionStack.lua
if self._stack then
for name, pin in pairs(self.pinOut) do
self.pinOut[name].value = self._stack[name]
-- collect the in-pins of this node
for name, pin in pairs(node.pinInLocal) do
if name ~= 'flow' then
-- collect the out-pins of this node
for name, pin in pairs(node.pinOut) do
if name ~= 'flow' then
self._pinTemplates = {_in = {}, _out = {}}
for name, type in pairs(pins) do table.insert(self._pinTemplates._in, {name = name, type = type}) end
table.sort(self._pinTemplates._in, function(a,b) return a.name < b.name end)
@/lua/ge/extensions/editor/inspector.lua
for fldName, field in pairs(ctx.fields) do
if field.useCount == tableSize(valueInspector.selectedIds) then
local fieldVal = nil
for key, val in pairs(ctx.fields) do
-- we start at the second object, since the first one we keep as reference
-- set the sorted fields array and sort the array fields
for _, field in pairs(ctx.fields) do
if field.type == "beginArray" then
field.sortedFields = {}
for _, fld in pairs(field.fields) do table.insert(field.sortedFields, fld) end
table.sort(field.sortedFields, function(a, b) return a.id < b.id end)
if val then
for k, v in pairs(inspectorFieldModifiers) do
if v.callback then
-- otherwise we skip it, since it would not make sense when not common
for key, val in pairs(dynFieldUsage) do
if val == #valueInspector.selectedIds then
if guiInstancer.instances then
for key, inspectorInfo in pairs(guiInstancer.instances) do
local wndName = inspectorWindowNamePrefix .. key
-- first lets check if we have multiple selection types
for _, val in pairs(editor.selection) do
if not tableIsEmpty(val) then
imgui.Text("Multiple types selected:")
for className, val in pairs(editor.selection) do
imgui.Text(#val .. " " .. className .. "(s)")
-- so we provide a function for the current mode, the default is object inspector objectInspectorGui function
for typeName, typeHandler in pairs(inspectorTypeHandlers) do
-- if we have a locked inspector, use its selection
guiInstancer:deserialize("inspectorInstances", state)
for key, val in pairs(guiInstancer.instances) do
editor.registerWindow(inspectorWindowNamePrefix .. tostring(key), imgui.ImVec2(300, 500))
if objFields then
for fldName, field in pairs(objFields) do
if sharedCtx.fields[fldName] == nil then
@/lua/vehicle/controller/couplings/fifthwheel.lua
table.clear(kingpinTimeoutsToDelete)
for obj2Id, _ in pairs(kingpinRequestTimeouts) do
kingpinRequestTimeouts[obj2Id] = kingpinRequestTimeouts[obj2Id] - dt
local minDistanceNodeCid
for objId, nodeData in pairs(kingpinCache) do
for nodeCid, data in pairs(nodeData) do
for objId, nodeData in pairs(kingpinCache) do
for nodeCid, data in pairs(nodeData) do
if data.distance < minDistance then
@/lua/ge/extensions/gameplay/drag/utils.lua
racer._wheelDistances = {}
for k, wheel in pairs(racer.wheelsCenter) do
racer._wheelDistances[k] = racer._wheelDistances[k] or vec3()
local winnerList = {}
for _, racer in pairs(dragData.racers) do
table.insert(winnerList, {
local winnerList = {}
for _, racer in pairs(dragData.racers) do
local dialDiff = (racer.timers.time_1_4.value + racer.timers.reactionTime.value) - racer.timers.dial.value
if not dragData then return end
for vehId, racer in pairs(dragData.racers) do
local index = racer.currentPhase + 1
local allRacersFinished = true
for _, r in pairs(dragData.racers) do
if not r.timers.time_1_4.isSet then
for k, offset in pairs(racer.allWheelsOffsets) do
if not racer.wheelsCenter[k] then
for k, distVec in pairs(racer._wheelDistances or {}) do
if not racer.beamState[k] then
@/lua/ge/extensions/editor/flowgraph/main.lua
end
for k, node in pairs(graph.nodes) do
local status, err, res = xpcall(node.draw, debug.traceback, node, builder, style, drawType)
local hiddenLinks = {}
for _, link in pairs(graph.links) do
if link.hidden then
end
for _,gr in pairs(self.mgr.graphs) do table.insert(allGraphs, gr) end
-- graph tabs
local nIds, boxes = {}, {}
for _, g in pairs(self.mgr.graphs) do
for nid, _ in pairs(g.nodes) do
for _, g in pairs(self.mgr.graphs) do
for nid, _ in pairs(g.nodes) do
local box = math.ceil(nid/100)
-- DBEUG: draw all graphs:
--for _, g in pairs(self.mgr.graphs) do self:drawGraph(g, builder, style) end
-- draw current graph only:
local lnks = {}
for _, gr in pairs(self.mgr.graphs) do
drawnThisFrame = false
self:drawGraph(gr, builder, style)
for k, node in pairs(gr.nodes) do
for pinName, pin in pairs(node.pinInLocal) do
for k, node in pairs(gr.nodes) do
for pinName, pin in pairs(node.pinInLocal) do
if pin.type ~= "flow" then
else
for fName, flowPin in pairs(node._mInFlow[pinName] or {}) do
table.insert(lnks,{pin.id, flowPin.id, true})
if globIn and globOut then table.insert(lnks,{globIn,globOut,true}) end
for i,lnk in pairs(lnks) do
ui_flowgraph_editor.Link(9999999+i, lnk[1],lnk[2], lnk[3] and virtualFlowPinLinkCol or virtualPinLinkCol,15, false, "...")
--for _, node in pairs(gr.nodes) do
-- node:overDraw()
if self.fgEditor.delayedHistorySnapshot == nil and ui_flowgraph_editor.IsActive() then
for _, node in pairs(graph.nodes) do
node:updateNodePosition()
-- get unique names with their types
for _, node in pairs(self.mgr.graph.nodes) do
for _, p in pairs(node.pinList) do
for _, node in pairs(self.mgr.graph.nodes) do
for _, p in pairs(node.pinList) do
if p.quickAccess and p.direction ~= pin.direction then
self.quickConnectSortedNames = {}
for name,_ in pairs(self.quickConnectPins) do
table.insert(self.quickConnectSortedNames, name)
local ffiName = ffi.string(self.quickAccessTextfield)
for _, node in pairs(self.mgr.graph.nodes) do
for _, p in pairs(node.pinList) do
for _, node in pairs(self.mgr.graph.nodes) do
for _, p in pairs(node.pinList) do
if p.direction == pin.direction and p.quickAccess and p.accessName == ffiName then
local lnkRemove = nil
for _, lnk in pairs(self.mgr.graph.links) do
if lnk.sourcePin == pin and lnk.targetPin == other or lnk.sourcePin == other and lnk.targetPin == pin then
local toDelete = nil
for _, lnk in pairs(self.mgr.graph.links) do
if lnk.targetPin.id == pin.id then
local toDelete = nil
for _, lnk in pairs(self.mgr.graph.links) do
if lnk.targetPin == other then
@/lua/ge/extensions/ui/liveryEditor/tools.lua
dump("liveryEditor_editMode_onStateChanged", data)
for k, v in pairs(data) do
M.editModeState[k] = v
@/lua/ge/extensions/career/modules/missionWrapper.lua
gameplay_missions_progress.setSavePath(currentSavePath .. "/career/missions/")
for id, dirtyDate in pairs(allMissionData) do
if dirtyDate > oldSaveDate then
@/lua/common/jbeam/interaction.lua
tableMerge(actionCategories, j.actionCategories or {})
for k,action in pairs(j.actions or {}) do
action.source = filename
@/gameplay/missionTypes/aiRace/constructor.lua
unlockedStars.trafficRace = false
for id, v in pairs(gameplay_traffic.getTrafficData()) do
if be:getObjectActive(id) and v.roleName == 'standard' then
@/lua/ge/extensions/flowgraph/nodes/ui/monologue.lua
for i = old, new+1, -1 do
for _, lnk in pairs(self.graph.links) do
if lnk.sourcePin == self.pinInLocal['message_'..i] then
@/lua/ge/extensions/ui/ambientSound.lua
local soundTable={}
for k,v in pairs(soundFile) do
soundTable[k]=v
@/lua/ge/extensions/editor/decalSpline/populate.lua
if decalsBySpline then
for material, v in pairs(decalsBySpline) do
local numDecalsByShape = #v
-- Now check if any templates are no longer needed, and remove them.
for material, numInstances in pairs(instanceCounters) do
if numInstances < 1 then
@/lua/ge/extensions/editor/dynamicDecals/camera.lua
local presets = editor.getPreference("dynamicDecalsTool.camera.presets")
for name, val in pairs(presets) do
if im.Button(string.format("%s##%s_%s", name:gsub("^%l", string.upper), "Generate Materials", guiId), im.ImVec2(im.GetContentRegionAvailWidth(), 0)) then
local changed = false
for name, val in pairs(presets) do
if editor.uiIconImageButton(editor.icons.delete, im.ImVec2(tool.getIconSize(), tool.getIconSize()), nil, nil, nil, string.format("##dynDecals_camera_presets_remove_%d", i)) then
@/lua/ge/extensions/gameplay/discover/newPlayerExperience.lua
local dones = {}
for vehId, setup in pairs(setupVehs) do
local veh = getObjectByID(vehId)
end
for id, _ in pairs(dones) do
setupVehs[id] = nil
for _, discover in pairs(freeroamExperiences) do
table.insert(D.pageInfo.sections[1].discoverIds, discover.id)
end
for _, mission in pairs(missions) do
table.insert(D.pageInfo.sections[2].discoverIds, mission.id)
@/lua/ge/extensions/editor/forestEditor.lua
local delItems = {}
for _, item in pairs(deletedItems) do
table.insert(delItems, item)
-- make sure old and new transforms are in the same order as items
for itemKey, item in pairs(itemsUnique) do
table.insert(itemsTbl, item)
table.insert(itemsTbl, item)
for sKey, transformTbl in pairs(snappedItems) do
if sKey == itemKey then
end
for newTransformKey, transform in pairs(newTransforms) do
if newTransformKey == itemKey then
@/lua/common/libs/LuaIRC/asyncoperations.lua
if not b then
for k,v in pairs(self.channels) do
self.channels[k] = nil
@/lua/ge/extensions/ui/appSelector/general.lua
if apps then
for _, app in pairs(apps) do
if app.types then
local commonFilters = {}
for _, propName in pairs(filtersWhiteList) do
if filterByProp[propName] then
local options = {}
for option, _ in pairs(filterByProp[propName]) do
table.insert(options, option)
local items = {}
for _, app in pairs(apps) do
if filterInstance.passesFilters(app) then
local remainingCategories = {}
for category, _ in pairs(categoryGroups) do
table.insert(remainingCategories, category)
local allButtons = buttonInstance.getAllButtonInfos()
for buttonId, buttonInfo in pairs(allButtons) do
if buttonInfo.meta and buttonInfo.meta.label == translateHelper.translate("ui.apps.selector.addToLayout") then
@/lua/vehicle/powertrain/torsionReactor.lua
device.torqueReactionNodes = {}
for _, v in pairs(jbeamData.torqueReactionNodes_nodes or {}) do
if type(v) == "number" then
@/lua/vehicle/extensions/vehicleeditor/nodes.lua
local min = math.huge
for _,node in pairs(nodesTbl) do
totalWeight = totalWeight + obj:getNodeMass(node.cid)
@/lua/ge/extensions/editor/extensionsDebug.lua
local sortedKeys = extensions.getLoadedExtensionsNames()
for _,k in pairs(sortedKeys) do
if im.TreeNodeEx1(k) then
@/lua/ge/extensions/ui/gameplaySelector/general.lua
if gameplayList then
for _, item in pairs(gameplayList) do
for _, propName in pairs(filtersWhiteList) do
for _, item in pairs(gameplayList) do
for _, propName in pairs(filtersWhiteList) do
local propVal = item[propName:lower()]
if type(propVal) == "table" then
for _, val in pairs(propVal) do
filterByProp[propName][val] = true
local filters = {}
for _, propName in pairs(filtersWhiteList) do
local options = {}
local options = {}
for option, _ in pairs(filterByProp[propName] or {}) do
table.insert(options, option)
if not match then
for _, propName in pairs(filtersWhiteList) do
local propVal = item[propName:lower()] or item[propName]
if filter.type == 'set' then
for _, option in pairs(filter.options) do
if propVal == option and not filter.currentFilterValues[option] then
local validItems = {}
for _, item in pairs(items) do
if item.validBackends[M.backendName] then
@/lua/common/libs/resty/template/html.lua
if attr then
for k, v in pairs(attr) do
if type(k) == "number" then
@/lua/console/bananabench.lua
local timeTotalSum = 0
for k,vehicle in pairs(vehicles) do
local testVehicle = 'vehicles/' .. vehicle .. '/'
@/lua/ge/extensions/gameplay/crashTest/scenarioManager.lua
local objects = {}
for objId, _ in pairs(map.objects) do
local object = getObjectByID(objId)
local playerWasInvolved = false
for vehId, _ in pairs(crashEndData.sanitizedData.touchedVehIds) do
if vehId == currentStepParameters.plVehId then
@/lua/ge/extensions/editor/gen/lib/ai.lua
local alib = {}
for _,p in pairs(apth) do
unrequire(p)
-- dump(g, '?? for_g:'..N)
for i,c in pairs(ac) do
ac[i] = ac[i] + g[i]*1
-- dump(g, '?? for_g:'..N)
for i,c in pairs(ac) do
ac[i] = ac[i] + g[i]*5
local s = 0
for i,p in pairs(set) do
local ds = (p - (a + u*(p-a):dot(u))):length()
-- local c = vec3(0,0,0)
-- for i,p in pairs(set) do
-- c = c + p
@/lua/ge/extensions/editor/assetDeduplicator.lua
job.allfiles = #jobData.selectedLinks
for k,v in pairs(selectedLinks) do
if job.status == 0 then
local isTexture = false
for _,b in pairs(cases) do
if string.lower(leftPath):find(b) then isTexture = true end
local isTexture = false
for _,b in pairs(cases) do
if string.lower(rightPath):find(b) then isTexture = true end
local sortedKeys = {}
for k in pairs(matches) do
sortedKeys[#sortedKeys + 1] = k
end
for path, _ in pairs(stockLevels) do
local filenames = FS:findFiles(path, "*.jpg\t*.png\t*.dds\t*.dae\t*.cdae\t*.glb\t*.gltf", -1, true, false)
end
for path, _ in pairs(modLevels) do
local filenames = FS:findFiles(path, "*.jpg\t*.png\t*.dds\t*.dae\t*.cdae\t*.glb\t*.gltf", -1, true, false)
local currentLevelRoot
for p in pairs(currentLevelData) do
job.yield()
local assetsByKey = {}
for path, info in pairs(assetData) do
if not isBlacklisted(path) and allowedByModLink(info) then
local artByKey = {}
for path, info in pairs(artData) do
if not isBlacklisted(path) and allowedByModLink(info) then
local stockByKey = {}
for _, folderTable in pairs(stockLevelsData) do
if type(folderTable) == "table" then
if type(folderTable) == "table" then
for path, info in pairs(folderTable) do
if not isBlacklisted(path) and allowedByModLink(info) then
if modLink then
for _, folderTable in pairs(modLevelsData) do
if type(folderTable) == "table" then
if type(folderTable) == "table" then
for path, info in pairs(folderTable) do
if not isBlacklisted(path) then
for path in pairs(currentLevelData) do
if not isBlacklisted(path) then
for curPath, info in pairs(currentLevelData) do
if not isBlacklisted(curPath) then
@/lua/ge/extensions/flowgraph/nodes/util/file/saveData.lua
if self.pinIn.file.value then
for name, pin in pairs(self.pinIn) do
if name ~= 'flow' and name ~= 'reset' and name ~= 'file' then
@/lua/ge/extensions/flowgraph/nodes/career/onMissionPromptShown.lua
self.pinOut.openedMenu.value = false
for flag, act in pairs(self.flags) do
self.pinOut[flag].value = act
@/lua/ge/extensions/scenario/race_marker.lua
local function hide()
for _, m in pairs(idToMarker) do
m:hide()
local function show()
for _, m in pairs(idToMarker) do
m:show()
--if not markers[name] then return end
for id, marker in pairs(markers[name] or {}) do
marker:clearMarkers()
-- blend all markers.
for _, m in pairs(idToMarker) do
m:update(dt, dtSim)
local function setModes(wpModes)
for name, marker in pairs(markers[markerListName] or {}) do
marker:setMode(wpModes[name] or 'hidden')
local function setToCheckpoints(data)
for name, marker in pairs(markers[markerListName] or {}) do
if data[name] then
local function drawOnMinimap(td)
for _, marker in pairs(markers[markerListName] or {}) do
if marker.drawOnMinimap then
@/lua/ge/extensions/career/modules/delivery/vehicleTasks.lua
local reputationRewards = {}
for rewardKey, rewardValue in pairs(originalRewards) do
if rewardKey:endswith("Reputation") then
partsBreakdown.rewards = {money = -origMoney}
for rewardKey, rewardValue in pairs(reputationRewards) do
partsBreakdown.rewards[rewardKey] = -2 * rewardValue
partsBreakdown.rewards = {money = -(1-brokenPartsMultipler)*origMoney}
for rewardKey, rewardValue in pairs(reputationRewards) do
partsBreakdown.rewards[rewardKey] = -(1-brokenPartsMultipler) * rewardValue
local rewards = {money=origMoney*0.15+10}
for rewardKey, rewardValue in pairs(reputationRewards) do
rewards[rewardKey] = math.ceil(rewardValue*0.125)
local rewards = {money=origMoney*0.15+10}
for rewardKey, rewardValue in pairs(reputationRewards) do
rewards[rewardKey] = math.ceil(rewardValue*0.125)
for organizationId, _ in pairs(taskData.loanerOrganisations or {}) do
local organization = freeroam_organizations.getOrganization(organizationId)
for _, bd in ipairs(breakdown) do
for key, amount in pairs(bd.rewards) do
adjustedRewards[key] = (adjustedRewards[key] or 0) + amount
for _, taskData in ipairs(vehicleTasks) do
for attKey, amount in pairs(M.getFineForAbandon(taskData)) do
fine[attKey] = (fine[attKey] or 0) + amount
@/lua/ge/extensions/core/checkpoints.lua
local vehicleCheckpoints = M.state.vehicleCheckpoints
for vid,data in pairs(vehicleCheckpoints) do
data.checkTimer = data.checkTimer + dt
resetData()
for _, vid in pairs(scenario.vehicleNameToId or {}) do
initialiseCheckpointData(vid)
@/lua/ge/extensions/editor/util/editorElementHelper.lua
table.sort(sortedKeys)
for _, key in pairs(sortedKeys) do
if key ~= "fieldName" and string.startswith(key, "fieldName") then
-- find all field with fieldname
for _, key in pairs(sortedKeys) do
if key ~= "fieldName" and string.startswith(key, "fieldName") then
C.__index = C
for k, v in pairs(derivedClass) do
o[k] = v
@/lua/ge/extensions/editor/gen/network.lua
local aang = {}
for i,v in pairs(apos) do
aang[#aang + 1] = {i, math.atan2(v.y, v.x) % (2*math.pi)}
state = {}
for i,l in pairs(lines) do
local a = U.split(l,',')
local apair = {}
for o,s in pairs(edges.astamp) do
if (edges.infaces[s] ~= nil and math.abs(edges.infaces[s]) == 1) or #edges.astamp == 1 then
end
for _,n in pairs(anode) do
n.pos = n.pos + (pos or vec3(0))
massCenter = vec3(0,0,0)
for _,n in pairs(anode) do
massCenter = massCenter + n.pos
local dpos = pos - massCenter/#anode
for _,n in pairs(anode) do
n.pos = n.pos + dpos
local star, anear = {}, {}
for _,iuse in pairs(ause) do
anear[#anear + 1] = iuse - 1
end
for _,j in pairs(anear) do
if j > 0 and j <= #path then
local dma = 0
for i,n in pairs(anode) do
local step = U.stamp({cp, i})
local crossed, xc, yc
for o,p in pairs(ap) do
local w = wa * p.d/dma + wb * p.ang/math.pi + (1 - (wa + wb)) * p.used
end
for _,pth in pairs(apath) do
crossed = forCross(pth)
apath[#apath + 1] = path
for _,s in pairs(path) do
jointpath[#jointpath + 1] = s
local aang, angp = {}, 0
for _,i in pairs(star) do
local v = anode[i].pos - anode[s].pos
-- relative to p
for o,_ in pairs(aang) do
aang[o][2] = (aang[o][2] - angp) % (2*math.pi)
lo('>> roadAni:')
for key,list in pairs(dlist) do
-- U.dump(list, '?? ani_LIST:'..key..':'..#list)
-- U.dump(nodelist, '?? NLIST:'..#nodelist)
for k,n in pairs(nodelist) do
-- for k,n in pairs(acnode) do
for k,n in pairs(nodelist) do
-- for k,n in pairs(acnode) do
for i = cedge,nedge do
-- local s = aseg[i]
for i,s in pairs(aseg) do
-- U.dump(s, '?? for_seg:'..i)
local an = {s[3]}
for _,n in pairs(s) do
if n.tp and n.tp == 1 then
local nma = 0
for _,s in pairs(ani) do
if #s > nma then
local epos = road:getMiddleEdgePosition(i)
for k,n in pairs(acnode) do
if (n.pos - epos):length() < 0.1 then
local p = pth[o]
-- for o,p in pairs(dec) do
local set = 0
-- reset heights
for o,n in pairs(adec) do
if dbg then
-- build decal
for _,r in pairs(roads) do
local rd = path2decal(r, wHeighway)
local an = {}
for _,p in pairs(apos) do
an[#an + 1] = {pos = p, width = w}
-- get branches
for i,r in pairs(roads) do
local inpath = U.index(r.path, icirc)
-- U.dump(r.apin, '?? r:'..i)
for _,j in pairs(inpath) do
inedge[#inedge + 1] = {i, r.apin[r.path2dec[j]][1]}
local adir = {}
for _,s in pairs(inedge) do
print('?? for_s:'..s[1]..':'..s[2])
-- circles
for o,n in pairs(anode) do
local clr = color(255,255,255,255)
-- paths
for i,l in pairs(apath) do
for j,s in pairs(l) do
for i,l in pairs(apath) do
for j,s in pairs(l) do
if j > 1 then
@/lua/ge/extensions/core/repository.lua
--guihooks.trigger('downloadStateChanged', r);
for k,v in pairs(progressQueue) do
if v.id == r.id then
log('D', 'repo.deleteUpdateQueue', 'delete ' .. tostring(data.filename) ..' URI=' .. tostring(data.filename))
for k,v in pairs(updateQueue) do
if v.uri == data.uri then
for k,v in pairs(updateQueue) do
if v.id == idlook then return true end
for k,v in pairs(updateQueue) do
if v.id == idlook then return v.state end
-- local toDelete = {}
for k,v in pairs(updateQueue) do
-- log('D', 'repo.updateDownloadQueue',v.filename.." update="..tostring(v.update) .." state="..tostring(v.state) )
-- if(#toDelete>0) then
-- for k,v in pairs(toDelete) do
-- deleteUpdateQueue(v)
for k,v in pairs(updateQueue) do
if v.update and v.state == "updating" and downloading < parDownloads then
--log('I', 'repo.changeStatusUpdateQueue', ' ' .. tostring(fname))
for k,v in pairs(updateQueue) do
if v.filename == fname then
data.modID = string.match(uri, '%w+')
for k,v in pairs(progressQueue) do
if v.id == r.id then
end
for k,v in pairs(updateQueue) do
if v.id==data.modID then
end
for k,v in pairs(updateQueue) do
if v.id==data.modID then table.remove( updateQueue, k ) end
guihooks.trigger("toastrMsg", {type="error", title="Repo Error", msg="Could not download the file, File missing"})
for k,v in pairs(updateQueue) do
if v.id==data.modID then table.remove( updateQueue, k ) end
local finished = true
for k,v in pairs(updateQueue) do
if v.update and v.state ~= "done" then
-- log('I', 'repo.finish', "updateQueue"..dumps(updateQueue) )
for k,v in pairs(updateQueue) do
if v.state == "done" then
request.responseData.automationMsg = repoAutomationMsg
for k,v in pairs(modList) do
modList[k].pending = idInUpdateQueue(v.tagid)
request.responseData.automationMsg = repoAutomationMsg
for k,v in pairs(modList) do
modList[k].pending = idInUpdateQueue(v.id)
for k,v in pairs(updateQueue) do
if v.id == mod_id then log('E', 'repo.modSubscribe', "Subscription '"..tostring(mod_id).."' already in update list"); return end
for k,v in pairs(updateQueue) do
if v.reason ~= "subscription" then v.update = false end
log('D', 'repo.modUnsubscribe', tostring(mod_id).." -> "..tostring(modName))
for k,v in pairs(updateQueue) do
if v.id == mod_id then
local function addUpdateQueue(data)
for k,v in pairs(updateQueue) do --no duplicate
if v.id == data.id then return end
updatingRepo = true
for k,v in pairs(updateQueue) do
if v.action == "update" then
updatingRepo = true
for k,v in pairs(updateQueue) do
if v.id == id then
updatingRepo = true
for k,v in pairs(updateQueue) do
if v.action == "missing" then
if repoCmd.forceInstall then
for k,v in pairs(repoCmd.forceInstall) do
if core_modmanager.getModNameFromID(v) == nil then
if repoCmd.forceRemove then
for k,v in pairs(repoCmd.forceRemove) do
if core_modmanager.getModNameFromID(v) ~= nil then
if repoCmd.forceDisable then
for k,v in pairs(repoCmd.forceDisable) do
guihooks.trigger('repoError', 'force Disable : '..v)
if #subList > 0 and core_modmanager.isReady() and Engine.Online.isAuthenticated() then
for k,v in pairs(subList) do
modSubscribe(v)
@/lua/ge/extensions/flowgraph/nodes/vehicle/touching.lua
local ids = {}
for k,v in pairs(cols) do
table.insert(ids,k)
@/lua/ge/extensions/flowgraph/nodes/logic/switchcase.lua
for i = old, new+1, -1 do
for _, lnk in pairs(self.graph.links) do
if lnk.sourcePin == self.pinOut['match_'..i] then
@/lua/ge/extensions/util/trackBuilder/splineTrack.lua
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[orig_key] = orig_value
if segment.noPoints then return end
for name, index in pairs(segment.submeshIndexes) do
segment.mesh:setMaterial(index, segment.selected and 'track_editor_grid' or segment.materialInfo[name])
pieces[index].materialInfo = {}
for key, val in pairs(pieceBefore.materialInfo) do
pieces[index].materialInfo[key] = val
end
for key, val in pairs(p.materialInfo) do
if not export.materials[s] then export.materials[s] = {} end
for s,subMats in ipairs(import.materials) do
for field, mats in pairs(subMats) do
for mat, list in pairs(mats) do
for field, mats in pairs(subMats) do
for mat, list in pairs(mats) do
for _, index in pairs(list) do
for mat, list in pairs(mats) do
for _, index in pairs(list) do
subPieces[s][index].materialInfo[field] = mat
@/lua/ge/extensions/editor/scriptAIManager.lua
-- TODO: FIXME
for _, vii in pairs(vehInfo[vehId]) do
if vii and vii.scriptTime then
local files = FS:findFiles(trackFilePath, '*' .. trackFileExt, -1, true, false)
for _, filename in pairs(files) do
if recordings[vehId] and displayDebugBoolPtr[vehId] and displayDebugBoolPtr[vehId][0]then
for k, p in pairs(recordings[vehId].path) do
dbgPt:set(p.x, p.y, p.z)
@/lua/ge/extensions/editor/mainToolbar.lua
if gridSnapComboItemCurrent[0] == -1 then
for i, val in pairs(gridSnapWidgetsComboItemsTbl) do
if tonumber(val) == gridSize then gridSnapComboItemCurrent[0] = i - 1 end
if rotateSnapComboItemCurrent[0] == -1 then
for i, val in pairs(rotateSnapWidgetsComboItemsTbl) do
if tonumber(val) == rotateSnapSize then rotateSnapComboItemCurrent[0] = i - 1 end
local function drawAlwaysVisibleToolbars()
for key, val in pairs(editor.editModes) do
if val["toolbarAlwaysVisible"] and val.onToolbar then
local function toolbarAlwaysVisibleModeExists()
for key, val in pairs(editor.editModes) do
if val["toolbarAlwaysVisible"] and val.onToolbar then
local sortedKeys = {}
for key, val in pairs(editor.editModes) do
if key ~= "objectSelect" and key ~= "createObject" and val.icon then table.insert(sortedKeys, key) end
local idx = 1
for _, key in pairs(sortedKeys) do
if key ~= "objectSelect" and key ~= "createObject" then
local function getModeKeyWithDisplayName(displayName)
for key, val in pairs(editor.editModes) do
if val.displayName == displayName then
-- Find the mode key by display name
for key, val in pairs(editor.editModes) do
if val.displayName == modeName then
allModes = {}
for key, val in pairs(editor.editModes) do
if val.icon and key ~= "objectSelect" and key ~= "createObject" then
-- Clear the selected list
for k in pairs(selectedModesList) do selectedModesList[k] = nil end
-- Save changes to current set
if pushedModeBtn then
for _, val in pairs(editor.editModes) do
-- toolbar is always visible in create mode
if pushedModeBtn then
for _, val in pairs(editor.editModes) do
-- toolbar is always visible in create mode
@/lua/vehicle/extensions/tech/powertrainSensor.lua
local function updateGFX(dtSim)
for sensorId, _ in pairs(powertrains) do
updatePowertrainGFXStep(dtSim, sensorId, false, nil)
local function onVehicleDestroyed(vid)
for sensorId, _ in pairs(powertrains) do
if vid == objectId then
@/lua/ge/extensions/flowgraph/nodes/states/stateNode.lua
local rootGraphs = {}
for _, graph in pairs(self.mgr.graphs) do
if graph.type == "graph" and graph:getParent() == nil and (not self.mgr.stateGraph or graph.id ~= self.mgr.stateGraph.id) then
if im.BeginCombo("Target Graph", label) then
for _, graph in pairs(rootGraphs) do
if im.Selectable1(graph.id .. "-"..graph.name, graph.id == id) then
local names = {}
for n, pin in pairs(self.pinOut) do
table.insert(names,n)
@/lua/ge/extensions/core/online.lua
local requests_pub = {}
for id, r in pairs(requests) do
requests_pub[id] = r.pub
local data2display = {}
for _, data in pairs(storedMessages) do
if data.uid and hidden_ids[data.uid] then
for _, cmd in pairs(data.cmds) do
if cmd.type == 'message' then
@/lua/ge/extensions/flowgraph/nodes/ui/buttons/getMultipleButtons.lua
for i = old, new+1, -1 do
for _, lnk in pairs(self.graph.links) do
if lnk.sourcePin == self.pinOut['clicked_'..i] then
@/lua/ge/extensions/gameplay/sites/customFields.lua
for name, val in pairs(self.values) do
if self.types[name] == 'vec3' then
table.clear(self.sortedTags)
for k, _ in pairs(self.tags) do
table.insert(self.sortedTags, k)
@/lua/ge/extensions/career/modules/milestones/milestones.lua
milestone.filter = milestone.filter or {missingFilter=true}
for key, _ in pairs(milestone.filter) do
filters[key] = true
@/lua/ge/extensions/flowgraph/nodes/career/onMissionRunstateChanged.lua
self.pinOut.started.value = false
for flag, act in pairs(self.flags) do
self.pinOut[flag].value = act
@/lua/ge/extensions/career/modules/playerDriving.lua
for k, v in pairs(gameplay_traffic.getTrafficData()) do
if v.role.name == "police" then
playerData.preStartTicks = playerData.preStartTicks - 1
for k, v in pairs(freeroam_specialTriggers.getTriggers()) do
if not v.vehIds[be:getPlayerVehicleID(0)] then
@/lua/ge/extensions/core/environment.lua
local knownProblems = {hydrodnamicFriction='hydrodynamicFriction', flowBehaviourIndex='flowBehaviorIndex'}
for j, _ in pairs(v) do
if knownProblems[j] then
local newGms = {}
for k, v in pairs(gms) do
if string.len(k) > 31 then
local sortedGmNames = {}
for k, v in pairs(gms) do
if k ~= 'ASPHALT' then
-- filter paths to only return filename without extension
for _,fn in pairs(files) do
tableMerge(allGroundModels, loadGroundModelFile(fn));
local function onFilesChanged(files)
for _,v in pairs(files) do
local filename = v.filename
filename = string.upper(filename)
for _, f in pairs(M.loadedGroundModelFiles) do
if string.upper(f) == filename then
local function onClientEndMission()
for k,v in pairs(myTexture) do
myTexture[k] = nil
@/lua/vehicle/extensions/tech/CANBus/ProjectBavariaController.lua
local function emitInputs()
for buttonName, buttonValue in pairs(hardwareState.buttons) do
if lastHardwareState.buttons[buttonName] ~= buttonValue then
for axisName, axisValue in pairs(hardwareState.axes) do
if lastHardwareState.axes[axisName] ~= axisValue then
buttonStateLookup = {}
for key, value in pairs(buttonTypes) do
buttonTypeLookup[value] = key
end
for key, value in pairs(buttonStates) do
buttonStateLookup[value] = key
@/lua/ge/extensions/editor/drivePathEditor/splineMgr.lua
local lines, edgeSeen = {}, {}
for fromIdx, targets in pairs(graph) do
local p0, w0 = positions[fromIdx], radius[fromIdx]
if p0 then
for toIdx, _ in pairs(targets) do
local key = fromIdx < toIdx and (fromIdx .. "-" .. toIdx) or (toIdx .. "-" .. fromIdx)
@/lua/ge/extensions/gameplay/rally/driveline/drivelineRoute.lua
local updateStableIdIndexes = function(stableIdIndex, insertItem)
for k, item in pairs(stableIdIndex) do
if item.idx >= insertItem.idx then
-- gcprobe() -- about 3000
for percent, hit in pairs(event.cornerPercentHit) do
-- gcprobe() -- a couple on first pass after full reset
-- gcprobe() -- none
for offset, hit in pairs(event.csMeterOffsetHit) do
distOffset = offset
-- gcprobe() -- needs attention
for offset, hit in pairs(event.ceMeterOffsetHit) do
local distOffset = offset
local s = ""
for k, v in pairs(t) do
s = s .. tostring(k) .. "=" .. valToStr(v) .. " "
local md = {}
for k,v in pairs(point.metadata) do
if type(v) == "table" then
@/gameplay/missionTypes/evade/constructor.lua
unlockedStars.completeTraffic = false
for id, v in pairs(gameplay_traffic.getTrafficData()) do
if be:getObjectActive(id) and v.roleName == 'standard' then
@/lua/ge/extensions/core/camera.lua
globalCamerasCache = {}
for camName,constructor in pairs(getConstructors()) do
local cam = constructor()
runningCamsOrderCache = {}
for camName,cam in pairs(getGlobalCameras()) do
if cam.runningOrder then
local camConfigs = {}
for camMode,constructor in pairs(getConstructors()) do
if tableFindKey(multicams, camMode) then
local jbeamConfigs = vmcd[camMode] or {}
for i,jbeamConfig in pairs(jbeamConfigs) do
table.insert(camConfigs, {name=camMode.."."..jbeamConfig.name, constructor=constructor, jbeamConfig=jbeamConfig})
local renaminingCamNames = {}
for name, cam in pairs(vdata.cameras) do
local configured = false
if not cameraSet then
for k,v in pairs(configuration) do
if v.enabled and vdata.cameras[v.name] and not vdata.cameras[v.name].hidden then
if not cameraSet then
for k,v in pairs(configuration) do
if vdata.cameras[v.name] then
if vdata then
for camName, camera in pairs(vdata.cameras) do
camera.wasFocused = vdata.focusedCamName == camName
if vdata then
for _, camera in pairs(vdata.cameras) do
if camera.wasFocused == true then
local function proxy_all(functionName, ...)
for vid, vdata in pairs(getVehicleData()) do
for _, cam in pairs(vdata.cameras) do
for vid, vdata in pairs(getVehicleData()) do
for _, cam in pairs(vdata.cameras) do
if cam[functionName] then
end
for _,cam in pairs(getGlobalCameras()) do
if cam[functionName] then
settings.setValue('cameraConfig', "")
for vid, vdata in pairs(getVehicleData()) do
processVehicleCameraConfigChanged(vid, vdata, vdata.focusedCamName)
data.globalCameras = {}
for k,cam in pairs(getGlobalCameras()) do
if cam.onSerialize then cam:onSerialize() end
data.vehicleCameras = {}
for vid, vdata in pairs(getVehicleData()) do
data.vehicleCameras[vid] = {}
data.vehicleCameras[vid].focusedCamName = vdata.focusedCamName
for camName,cam in pairs(vdata.cameras) do
data.vehicleCameras[vid].cameras[camName] = serialize(cam)
-- global cameras
for camName, cam in pairs(getGlobalCameras()) do
if data.globalCameras[camName] then
data.vehicleCameras = convertVehicleNameKeysToVehicleIdKeys(data.vehicleCameras)
for vid, vdata in pairs(getVehicleData()) do
local svdata = data.vehicleCameras[vid]
local svdata = data.vehicleCameras[vid]
for camName,cam in pairs(vdata.cameras) do
if svdata then
@/lua/ge/extensions/flowgraph/nodes/ui/imgui/elemental/imCheckbox.lua
function C:_executionStarted()
for _, p in pairs(self.pinOut) do
p.value = false
@/lua/vehicle/controller/sbrGauges.lua
local energyLeft = 0
for k, _ in pairs(batteriesUsed) do
local storage = energyStorage.getStorage(k)
local motors = powertrain.getDevicesByType("electricMotor")
for _, v in pairs(motors) do
for _, j in pairs(v.registeredEnergyStorages) do
for _, v in pairs(motors) do
for _, j in pairs(v.registeredEnergyStorages) do
batteriesUsed[j] = true
for k, _ in pairs(batteriesUsed) do
local storage = energyStorage.getStorage(k)
@/lua/ge/extensions/editor/raceEditor/pathnodes.lua
if not self.path then return end
for _, n in pairs(self.path.pathnodes.objects) do
n._drawMode = 'normal'
--self:selectPathnode(nil)
for _, n in pairs(self.path.pathnodes.objects) do
n._drawMode = 'faded'
self.index = id
for _, node in pairs(self.path.pathnodes.objects) do
node._drawMode = (id == node.id) and 'highlight' or 'normal'
local minNodeDist = 4294967295
for name, n in pairs(map.getManualWaypoints()) do
local node = self.map.nodes[name]
local closestNode = nil
for idx, node in pairs(self.path.pathnodes.objects) do
local distNodeToCam = (node.pos - self.mouseInfo.camPos):length()
local wps = {}
for name, node in pairs(map.getManualWaypoints()) do
local nd = self.map.nodes[name]
table.clear(sortedWaypointsNames)
for n,_ in pairs(map.getManualWaypoints()) do
table.insert(sortedWaypointsNames, n)
if im.BeginCombo("Target:##fromSegment", node.navgraphName) then
for _, name in pairs(sortedWaypointsNames) do
local nd = self.map.nodes[name]
@/lua/vehicle/controller/bypassDampers.lua
local beamNameLookup = {}
for _, b in pairs(v.data.beams) do
if b.name then
local damperJbeamData = tableFromHeaderTable(jbeamData.dampers or {})
for _, damperData in pairs(damperJbeamData) do
local beamCid = beamNameLookup[damperData.beamName]
local beamZones = {}
for _, zone in pairs(zoneJbeamData) do
local zoneData = {
local sortedZoneDistances = {}
for zoneDistance, _ in pairs(beamZones) do
table.insert(sortedZoneDistances, zoneDistance)
@/lua/ge/extensions/freeroam/specialTriggers.lua
for k, _ in pairs(triggers[key].objects) do
if scenetree.findObject(k) then
for k, v in pairs(triggers[key].objects) do
local obj = scenetree.findObject(k)
triggers[key].objects = {}
for k, v in pairs(data.objects) do
triggers[key].objects[k] = {
if useOrigState then
for k, v in pairs(triggers) do
removeTrigger(k, useOrigState)
for k, v in pairs(data) do
addTrigger(k, v)
if not active then
for _, vState in pairs(trigger.vehIds) do
if vState then
if trigger.objects then
for _, objData in pairs(trigger.objects) do
objData.timer = 0
for k, v in pairs(triggers) do
if v.type == 'zone' and zones.byName[k] and not v.vehIds[0] then -- veh id of 0 blocks detection
for k, v in pairs(triggers) do
if v.vehIds and isVehicleValid(k, newId) then
for k, v in pairs(triggers) do
if v.vehIds then
local zoneExists = false
for k, v in pairs(triggers) do
if v.type == 'zone' then
if v.objects then
for name, data in pairs(v.objects) do
local obj = scenetree.objectExists(name)
@/lua/ge/extensions/editor/gen/exp_frame.lua
local i = 1
for k,d in pairs(body) do
if not d.g then d.g = {} end
else
for j,_ in pairs(d.ac) do
if j == 1 then
local taa = {}
for k,d in pairs(body) do
-- lo('?? for_part:'..k..':'..#d.ac)
-- lo('?? for_part:'..k..':'..#d.ac)
for _,c in pairs(d.ac) do
taa[#taa+1] = c
-- U.dump(body,'>> build:'..#ac..':'..cfix)
for k,d in pairs(body) do
for j,_ in pairs(d.ac) do
for k,d in pairs(body) do
for j,_ in pairs(d.ac) do
-- if i == ind then
local list = {}
for k,d in pairs(body) do
list[#list+1] = {dnode[d.frto[1] ],dnode[d.frto[2] ]}
if sdw then
for i,v in pairs(adw[ind[2]]) do
if sdw[i] then
aa = {}
for k,d in pairs(body) do
lo('?? for_part:'..k..':'..#d.ac)
lo('?? for_part:'..k..':'..#d.ac)
for _,c in pairs(d.ac) do
if d.fix then
lo('?? for_L0:'..tostring(L)..':'..#aa)
for k,c in pairs(aa) do
local cac = step(aa, k, s)
list = {}
for k,d in pairs(body) do
list[#list+1] = {dnode[d.frto[1]],dnode[d.frto[2]]}
local set = {}
for _,d in pairs(dnode) do
set[#set+1] = d
list = {}
for k,d in pairs(body) do
list[#list+1] = {dnode[d.frto[1]],dnode[d.frto[2]]}
local list = {}
for k,d in pairs(body) do
list[#list+1] = {dnode[d.frto[1]],dnode[d.frto[2]]}
local akey = {}
for key,d in pairs(body) do
akey[#akey+1] = key
im.Columns(2)
for _,key in pairs(akey) do
local d = body[key]
im.Indent(80)
for i,val in pairs(d.ac) do
ord = ord + 1
akey = {}
for key,d in pairs(dw) do
akey[#akey+1] = key
local tot = 0
for i,key in pairs(akey) do
im.Text(key)
@/gameplay/missionTypes/aiRace/customNodes/collisionTrackingNode.lua
for id, v in pairs(self.pinIn.raceData.value.states) do
if self.pinIn.vehId.value ~= id and map.objects[id] then
@/lua/common/libs/luamqtt/mqtt/protocol.lua
local res = {}
for k, v in pairs(value) do
if type(k) == "number" then
local res = {}
for k, v in pairs(packet) do
res[#res + 1] = str_format("%s=%s", k, value_tostring(v))
@/lua/ge/extensions/editor/levelValidator.lua
local count = 0
for _ in pairs(ignoredObjects) do
count = count + 1
local sortedFields = {}
for field, _ in pairs(data) do
table.insert(sortedFields, field)
-- Check which sceneObjectNodes are planted
for i, node in pairs(sceneObjectNodes) do
if node.planted then
for i, node in pairs(forestItemNodes) do
if node.planted then
for id, node in pairs(sceneObjectNodes) do
if not node.planted then
job.yield()
for _, node in pairs(forestItemNodes) do
if not node.planted then
local foundDuplicate = false
for id2, hash2 in pairs(objectHashes) do
if hash == hash2 then
local filterFunctions = {}
for logLevel, _ in pairs(logLevelFilters) do
table.insert(filterFunctions, filterLogLevel(logLevel))
}
for type, idx in pairs(types) do
aggregatedElements.elementsByType[idx] = { elements = {}, count = 0, type = type }
@/lua/ge/extensions/flowgraph/nodes/vehicle/special/vehicleAction.lua
if actions then
for name, act in pairs(actions) do
if not act.ctx or act.ctx == 'vlua' then
@/lua/common/jbeam/sections/meshs.lua
if vehicleObj and vehicle.triangles then
for _, triangle in pairs(vehicle.triangles) do
-- skip denormalized tris
local prop_count = 0
for propKey, prop in pairs(vehicle.props) do
if disableSteeringProp and prop.func == 'steering' then
if vehicle.flexbodies ~= nil and vehicleObj then
for flexKey, flexbody in pairs(vehicle.flexbodies) do
local flexnodeCount = #flexbody['_group_nodes']
profilerPushEvent('flexmesh_rotate')
for _, v in pairs(vehicle.flexbodies) do
local x, y, z, rx, ry, rz = jbeamUtils.getFlexbodyPosRotAfterNodeRotateOffsetMove(v, v.pos and v.pos.x or 0, v.pos and v.pos.y or 0, v.pos and v.pos.z or 0, v.rot and v.rot.x or 0, v.rot and v.rot.y or 0, v.rot and v.rot.z or 0)
if vehicle.props ~= nil then
for _, prop in pairs(vehicle.props) do
if prop.mesh ~= "SPOTLIGHT" and prop.mesh ~= "POINTLIGHT" then
if vehicle.flexbodies ~= nil then
for _, flexbody in pairs(vehicle.flexbodies) do
vehicleObj:requestMesh(flexbody.mesh)
@/lua/ge/extensions/tech/openStreetMapExporter.lua
coords2d = {}
for k, p in pairs(coords3d) do
coords2d[k] = vec3(p.x, p.y, 0.0)
local ctr = 0
for k, v in pairs(table) do
if type(v) == 'table' then
local function doesCollectionContainSegment(collection, testSeg)
for k, trialSeg in pairs(collection) do
local matches = 0
local matches = 0
for k1, v1 in pairs(trialSeg) do
for k2, v2 in pairs(testSeg) do
for k1, v1 in pairs(trialSeg) do
for k2, v2 in pairs(testSeg) do
if v1 == v2 then
local function doesSegmentContainKey(currentPath, nextSuccessorKey)
for k, v in pairs(currentPath) do
if v == nextSuccessorKey then
local ctr = 1
for headKey, v1 in pairs(graph) do
local firstChildren = getChildren(graph[headKey])
-- Remove condition that filtered out nodes with 2 children
for childKey, v2 in pairs(successors) do
local currentPath = {}
local allSuccessorsVisited = true
for nextSuccessorKey, _ in pairs(nextSuccessors) do
if not doesSegmentContainKey(currentPath, nextSuccessorKey) then
local didFind = false
for nextSuccessorKey, v3 in pairs(nextSuccessors) do
if doesSegmentContainKey(currentPath, nextSuccessorKey) == false then
for k, v in pairs(coords3d) do
keysToNodeMap[k] = ctr
local ways = {}
for _, seg in pairs(pathSegments) do
local n = {}
@/lua/ge/extensions/flowgraph/nodes/ui/imgui/elemental/imColor.lua
function C:_executionStarted()
for _, p in pairs(self.pinOut) do
p.value = false
@/lua/ge/extensions/career/modules/vehicleClassGrouping.lua
for _, model in pairs(core_vehicles.getModelList().models) do
local modelType = model.Type or "Unknown"
if (modelType == "Car" or modelType == "Truck") and not checkFilter(modelFilter, model.key, invertedFilters.modelFilter) then
for _, config in pairs(core_vehicles.getModel(model.key).configs) do
local modelConfigKey = string.format("%s/%s", model.key, config.key)
@/lua/common/extensions.lua
local autoModulesSize = 0
for k, m in pairs(luaMods) do
if m.__manuallyLoaded__ then
log('W', logTag, 'Unloading the following modules. Their dependencies could not be resolved:')
for k, v in pairs(failedModules) do
log('W', logTag, ' ' .. tostring(k) .. ' dependencies not resolved: '..dumps(v))
-- nop the function cache so that existing hook iterations do not get invalidated as they are used
for fName, fList in pairs(luaExtensionFuncs) do
for i, _ in ipairs(fList) do
if #{...} > 1 then
for k,array in pairs({...}) do
for i, v in pairs(array) do
for k,array in pairs({...}) do
for i, v in pairs(array) do
table.insert(exceptionList, v)
if deprecatedExtensions then
for name,data in pairs(deprecatedExtensions) do
if type(m[name]) == 'function' then
for j, m in ipairs(resolvedModules) do
for name, value in pairs(m) do
if type(value) == "function" and name ~= "wrapAllExtensions" then
local function extSafetyCheck(m, extName, extPath)
for k, v in pairs(m) do
if type(v) == 'function' then
if profileAllExtensionFunctions then
for memberName, member in pairs(m) do
if type(member) == "function" then
local luaFiles = FS:findFiles(directory, '*.lua', -1, true, false)
for _,luaFilename in pairs(luaFiles) do
load(luaFilename:sub(1,-5)) -- strip '.lua'
local skip = false
for _,subDir in pairs(excludeSubdirectories) do
if string.find(file, subDir) then
local loadedModules = {}
for k, m in pairs(luaMods) do
local ignoreExtension = tableContains(doNotSerializeModules, m.__extensionName__)
local extbatch = {}
for extName,extPath in pairs(extensionsData.loadedModules) do
local tempExtName = luaPathToExtName(extPath)
if not m then return end
for k, func in pairs(m) do
if string.sub(k, 1, 2) == 'on' and type(func) == 'function' then
local hookLists = {}
for _, m in pairs(hookableTablesInstances) do
walkTable(hookLists, m, m)
self.hookProxies = {}
for k, sinkList in pairs(hookLists) do
self.hookProxies[k] = function(...)
self.hookProxies[k] = function(...)
for _, m in pairs(sinkList) do
m[k](m, ...)
local loadedNames = {}
for k, data in pairs(luaMods) do
if not excludeVirtual or not data.__virtual__ then
@/lua/ge/extensions/core/weather.lua
for objClassStr, attribTable in pairs(p) do
local objs = getObjectsByClass(objClassStr)
formerValues[objClassStr] = {}
for _, obj in pairs(objs) do
local id = obj:getId()
local fields = obj:getFields()
for attrName, attrValue in pairs(attribTable) do
formerValues[objClassStr][id][attrName] = {}
formerValues[objClassStr][id][attrName]['value'] = stringToTable(obj:getField(attrName, ' '))
for k,v in pairs(formerValues[objClassStr][id][attrName]['value']) do
formerValues[objClassStr][id][attrName]['value'][k] = tonumber(v)
formerValues[objClassStr][id][attrName]['value'] = stringToTable(obj:getField(attrName, ' '))
for k,v in pairs(formerValues[objClassStr][id][attrName]['value']) do
formerValues[objClassStr][id][attrName]['value'][k] = tonumber(v)
formerValues[objClassStr][id][attrName]['value'] = stringToTable(obj:getField(attrName, ' '))
for k,v in pairs(formerValues[objClassStr][id][attrName]['value']) do
formerValues[objClassStr][id][attrName]['value'][k] = tonumber(v)
local t = {}
for k,v in pairs(ta) do
t[k] = v - tb[k]
for objClassStr, objs in pairs(formerValues) do
diff[objClassStr] = {}
diff[objClassStr] = {}
for id, obj in pairs(objs) do
diff[objClassStr][id] = {}
diff[objClassStr][id] = {}
for attrName, attrVal in pairs(obj) do
if type(attrVal.value) == 'number' and p[objClassStr][attrName] ~= nil then
for objName, objVal in pairs(formerValues) do
local objects = getObjectsByClass(objName)
values[objName] = {}
for k,object in pairs(objects) do
values[objName][object:getId()] = object
local function multiplyTable( tbl, factor )
for k,v in pairs(tbl) do
tbl[k] = tbl[k] * factor
if diff and formerValues then
for objClassStr, obs in pairs(formerValues) do
for id, o in pairs(obs) do
for objClassStr, obs in pairs(formerValues) do
for id, o in pairs(obs) do
for attrName, attrVal in pairs(o) do
for id, o in pairs(obs) do
for attrName, attrVal in pairs(o) do
values[objClassStr][id][attrName] = formerValues[objClassStr][id][attrName]['setter'](formerValues[objClassStr][id][attrName]['value'], diff[objClassStr][id][attrName])
for objClassStr, attribTable in pairs(p) do
if type(objClassStr) ~= 'string' or type(attribTable) ~= 'table' then
else
for _, obj in pairs(objs) do
for attrName, attrValue in pairs(attribTable) do
for _, obj in pairs(objs) do
for attrName, attrValue in pairs(attribTable) do
local fields = obj:getFields()
local globalFiles = FS:findFiles('art/weather/', '*.json', -1, true, false) -- {"art/weather/defaults.json"}
for _, v in pairs(globalFiles) do
loadPreset(v)
local levelFiles = FS:findFiles(levelDir..'/weather/', '*.json', -1, true, false) -- {"levels/driver_training/weather/weather.json"}
for _, v in pairs(levelFiles) do
loadPreset(v)
local p = {}
for k,v in pairs(presets) do
table.insert(p,k)
@/lua/console/test.lua
log('I', "lua.test", "* loading jbeam files:")
for k,v in pairs(jbeamFiles) do
local content = readFile(v)
@/lua/vehicle/energyStorage/n2oTank.lua
for k, v in pairs(storage.nodes) do
obj:setNodeMass(k, v + storage.storedEnergy * storage.nodeMassCoef)
--apply final weight as soon as possible
for k, v in pairs(storage.nodes) do
obj:setNodeMass(k, v + storage.storedEnergy * storage.nodeMassCoef)
if jbeamData.nodes and jbeamData.nodes._engineGroup_nodes then
for _, n in pairs(jbeamData.nodes._engineGroup_nodes) do
storage.nodes[n] = v.data.nodes[n].nodeWeight --save initial mass as the offset for the node weights
--apply final weight as soon as possible
for k, v in pairs(storage.nodes) do
obj:setNodeMass(k, v + storage.storedEnergy * storage.nodeMassCoef)
@/lua/ge/extensions/flowgraph/nodes/gameplay/traffic/setVehicleFlowgraph.lua
local varData = {}
for name, pin in pairs(self.pinIn) do
if name ~= 'flow' and not pin.fixed then
@/lua/ge/extensions/editor/missionEditor.lua
local passed = true
for key, fun in pairs(filterFunctions) do
passed = passed and ( filterFunctions[key](mission, filter[key]))
table.sort(result.sortedKeys)
for key, list in pairs(result.missions) do
table.sort(list, idSort)
else
for key, list in pairs(mission.careerSetup.starRewards) do
local newRewards = {}
-- if the value didn't exist in the preferences, use the default bool by skipping the item
for k, v in pairs(_showWindows) do
if v ~= nil then
@/lua/vehicle/controller/drivingDynamics/supervisors/components/motorTorqueControl.lua
for k, v in pairs(wheelGroupControlData) do
debugPacket.wheelGroups[k] = debugPacket.wheelGroups[k] or {}
if controlParameters.tractionControl then
for k, v in pairs(controlParameters.tractionControl.wheelGroupSettings) do
debugPacket.tractionControl.wheelGroupControl[k] = debugPacket.tractionControl.wheelGroupControl[k] or {}
if controlParameters.tractionControl then
for k, _ in pairs(controlParameters.tractionControl.wheelGroupSettings) do
wheelGroupControlData[k].tractionControlPID:reset()
if controlParameters.tractionControl then
for k, v in pairs(controlParameters.tractionControl.wheelGroupSettings) do
wheelGroupControlData[k].slipThreshold = v.slipThreshold
for _, setting in pairs(jbeamPIDSettings) do
controlParameters.yawControl.PIDSettings[setting.type] = {
controlParameters.yawControl.controlledMotorNames = {}
for _, v in pairs(yawControlledMotors) do
relevantMotorNames[v] = true
for k, _ in pairs(relevantMotorNames) do
table.insert(controlledMotors, k)
for k, _ in pairs(wheelGroupControlData) do
CMU.applyParameter(controlParameters, initialControlParameters, parameters, "tractionControl.wheelGroupSettings." .. k .. ".kP")
@/lua/ge/extensions/gameplay/crawl/utils.lua
local dF = child:getDynamicFields()
for _, value in pairs(dF or {}) do
if type(value) == "string" and value == dynamicName then
-- Don't clear if any active crawl is from mission
for crawlerId, state in pairs(crawlStates) do
if state and state.active and state.isFromMission then
for crawlerId, _ in pairs(crawlStates) do
clearCrawler(crawlerId)
-- Mark completed nodes as finished (green)
for pathnodeId, _ in pairs(state.completedPathnodes) do
markerModes[tostring(pathnodeId)] = 'finished'
if state.skippedPathnodes then
for skippedId, _ in pairs(state.skippedPathnodes) do
-- Only mark as skipped if not completed (skipped nodes can be completed later)
local sortedPathnodeIndices = {}
for idx, _ in pairs(state.pathnodeTimings or {}) do
table.insert(sortedPathnodeIndices, idx)
if not force then
for crawlerId, state in pairs(crawlStates) do
if state and state.active and state.isFromMission then
for crawlerId, state in pairs(crawlStates) do
if not state or not state.active then
for crawlerId, state in pairs(crawlStates) do
if state.active then
M.getActiveCrawlerId = function()
for crawlerId, state in pairs(crawlStates) do
if state and state.active then
commands.dropPlayerAtCameraNoReset = function(player)
for crawlerId, state in pairs(crawlStates) do
if state and state.active then
recovery.startRecovering = function(useAltMode)
for crawlerId, state in pairs(crawlStates) do
if state and state.active then
local function trackVehReset()
for crawlerId, state in pairs(crawlStates) do
if state and state.active and state.crawlerData then
@/lua/ge/extensions/gameplay/missions/missionTypes/flowMission.lua
local setup = deepcopy(gameplay_missions_missions.getMissionProgressSetupData(self.missionType))
for k, v in pairs(setup) do
-- self[k] = v
end
for name, value in pairs(self.progressVariables) do
if self.progress[name] ~= nil then
end
for name, value in pairs(variables or {}) do
if self.progressVariables[name] ~= nil then
for k, v in pairs(self.oneOffVariables or {}) do
tempVariables[k] = v
-- setup existing progress variables.
for name, v in pairs(self.progressVariables or {}) do
local value = v
if self.userSettings then
for name, value in pairs(self.userSettings) do
if self:addOrSetVariable(name, value) then
function C:retrieveProgressFromFlowgraph()
for name,_ in pairs(self.progressVariables or {}) do
local value, exists = self.mgr.variables:get(name)
table.clear(results)
for id, btn in pairs(byId) do
table.insert(results, btn)
o:init()
for k, v in pairs(derivedClass) do
o[k] = v
@/lua/ge/extensions/editor/dynamicDecals/notification.lua
im.BeginChild1("DynamicDecals_Notification_NotificationsChild", im.ImVec2(0, im.GetContentRegionAvail().y - (math.ceil(im.GetFontSize()) + 2*style.ItemSpacing.y)), true)
for sectionName, sectionData in pairs(notifications) do
@/lua/ge/extensions/gameplay/discover/discover_037.lua
for _, discover in pairs(freeroamExperiences) do
table.insert(D.pageInfo.sections[1].discoverIds, discover.id)
table.insert(D.pageInfo.sections[1].discoverIds, "johnson_valley")
for _, mission in pairs(missions) do
table.insert(D.pageInfo.sections[2].discoverIds, mission.id)
@/lua/vehicle/extensions/tech/CANBus/CANBusPeak.lua
if receiveResult == M.errorCodes.OK then
for _, callback in pairs(canMessageCallbacks) do
callback(msg)
M.errorCodeLookup = {}
for key, value in pairs(M.errorCodes) do
M.errorCodeLookup[value] = key
@/lua/ge/extensions/tech/sensors.lua
local removedSensors = Research.SensorManager.removeSensorByVid(vid)
for sensorId, sensorType in pairs(removedSensors) do
extensions.hook('onSensorRemoved', sensorType, sensorId)
local outData = {}
for k, v in pairs(advancedIMULastRawReadings[sensorId]) do
outData[k] = v
local ctr = #advancedIMULastRawReadings[newReadings.sensorId]
for k, v in pairs(newReadings.reading) do
advancedIMULastRawReadings[newReadings.sensorId][ctr] = v
local outData = {}
for k, v in pairs(GPSLastRawReadings[sensorId]) do
outData[k] = v
local ctr = #GPSLastRawReadings[newReadings.sensorId]
for k, v in pairs(newReadings.reading) do
GPSLastRawReadings[newReadings.sensorId][ctr] = v
local outData = {}
for k, v in pairs(powertrainLastRawReadings[sensorId]) do
outData[k] = v
local ctr = #powertrainLastRawReadings[newReadings.sensorId]
for k, v in pairs(newReadings.reading) do
powertrainLastRawReadings[newReadings.sensorId][ctr] = v
local outData = {}
for k, v in pairs(idealRADARLastRawReadings[sensorId]) do
outData[k] = v
local ctr = #idealRADARLastRawReadings[newReadings.sensorId]
for k, v in pairs(newReadings.reading) do
idealRADARLastRawReadings[newReadings.sensorId][ctr] = v
local outData = {}
for k, v in pairs(roadsSensorLastRawReadings[sensorId]) do
outData[k] = v
local ctr = #roadsSensorLastRawReadings[newReadings.sensorId]
for k, v in pairs(newReadings.reading) do
roadsSensorLastRawReadings[newReadings.sensorId][ctr] = v
local coords = {}
for k, v in pairs(rawCoords) do
coords[k] = { v.x, v.y, v.z }
local rawNodes = map.getMap().nodes
for k, v in pairs(rawNodes) do
local n = v.normal
end
for sensorType, configs in pairs(luaSensorConfigurations) do
for sensorId, _ in pairs(configs) do
for sensorType, configs in pairs(luaSensorConfigurations) do
for sensorId, _ in pairs(configs) do
activeSensors[#activeSensors + 1] = {sensorType, sensorId}
-- Manage all the Raw LiDAR sensor updates.
for _, d in pairs(rawLidarData) do
-- Perform visualisation for all ultrasonic sensors which require it.
for sensorId, _ in pairs(visualisedUltrasonicSensors) do
visualiseUltrasonicSensor(sensorId, dtSim)
@/lua/ge/extensions/telemetry/core.lua
local trackersToUnload = {}
for trackerName, _ in pairs(trackingExtensions) do
local priority = trackerPriorities[trackerName] or 500
@/lua/ge/extensions/core/lapTimes.lua
slowStreamData.bestSegmentTimesFormatted = {}
for segmentIndex, time in pairs(bestSegmentTimes) do
local lap = bestSegmentLaps[segmentIndex] or 1
@/lua/vehicle/props.lua
local breakGroups = type(prop.breakGroup) == "table" and prop.breakGroup or {prop.breakGroup}
for _, g in pairs(breakGroups) do
if type(g) == "string" and g ~= "" then
local deformGroups = type(prop.deformGroup) == "table" and prop.deformGroup or {prop.deformGroup}
for _, g in pairs(deformGroups) do
if type(g) == "string" and g ~= "" then
@/lua/ge/extensions/freeroam/vueBigMap.lua
for key, val in pairs(gameplay_missions_progress.formatSaveDataForBigmap(mission.id) or {}) do
ret[key] = val
for groupKey, gr in pairs(groupData) do
gr.elements = {}
for tag, include in pairs(filterData.groupTags) do
if include then
-- Sort elements in each group
for key, gr in pairs(groupData) do
local elementsAsPois = {}
@/lua/ge/extensions/editor/util/vehicleFilterUtil.lua
for key, value in pairs(cleaned.values) do
if value == true then
-- Convert map to array
for _, vehicleModel in pairs(modelsMap) do
if #vehicleModel.configs > 0 then
local selectedOptions = {}
for option, selected in pairs(filter.values) do
if selected and option ~= 'Other...' then
if filterInfo then
for key, _ in pairs(filterInfo) do
if key ~= 'Other...' and not filter.values[key] then
local modelList, configList = {}, {}
for modelName, _ in pairs(core_vehicles.getModelsData()) do
table.insert(modelList, core_vehicles.getModel(modelName).model)
table.insert(modelList, core_vehicles.getModel(modelName).model)
for _, config in pairs(core_vehicles.getModel(modelName).configs or {}) do
table.insert(configList, config)
end
for _, value in pairs(values) do
filterByProp[propName][value] = true
for _, model in ipairs(modelList) do
for _, propName in pairs(filtersWhiteList) do
local propVal = model[propName]
-- Then scan configs (for config-level properties like Drivetrain, Config Type, etc.)
for _, config in pairs(configList) do
for _, propName in pairs(filtersWhiteList) do
for _, config in pairs(configList) do
for _, propName in pairs(filtersWhiteList) do
local propVal = config[propName]
local filterUiData = {}
for _, propName in pairs(filtersWhiteList) do
if filterByProp[propName] then
local selectedCount = 0
for _, selected in pairs(filter.values) do
if selected then selectedCount = selectedCount + 1 end
local selectedCount = 0
for _, selected in pairs(filter.values) do
if selected then selectedCount = selectedCount + 1 end
local selectedCount = 0
for _, selected in pairs(filter.values) do
if selected then selectedCount = selectedCount + 1 end
local selectedCount = 0
for _, selected in pairs(filter.values) do
if selected then selectedCount = selectedCount + 1 end
local currentRemovalsCount = 0
for _ in pairs(e.manualRemovals) do
currentRemovalsCount = currentRemovalsCount + 1
e._cachedRemovalsNested = {}
for configKey, _ in pairs(e.manualRemovals) do
local model, config = configKey:match("^([^/]+)/(.+)$")
local allModels = {}
for modelName, _ in pairs(core_vehicles.getModelsData()) do
local model = core_vehicles.getModel(modelName)
local configs = {}
for configName, _ in pairs(model.configs) do
table.insert(configs, configName)
@/lua/ge/extensions/gameplay/sites/sitesManager.lua
}
for fp, site in pairs(sitesCache) do
ret.sitesCache[fp] = site:onSerialize()
currentLevel = data.currentLevel or getCurrentLevelIdentifier()
for fp, s in pairs(data.sitesCache) do
local site = require('/lua/ge/extensions/gameplay/sites/sites')()
@/lua/ge/extensions/ui/vehicleSelector/tiles.lua
context.profiler:add("setupValidFilters")
for _, config in pairs(data.configs) do
-- VEHICLE-SPECIFIC: Uses vehicle-specific filter logic
local favouriteGroup, recentGroup = {tiles = {}}, {tiles = {}}
for _, config in pairs(validConfigs) do
-- GENERIC: Get groups for item (could work for any item type)
local groupsForConfig = context.groupingModule.getGroupsForConfig(config, data.displayData.groupMode, data.displayData)
for _, group in pairs(groupsForConfig) do
local groupName, groupOrder = group.groupName, group.groupOrder
-- GENERIC: Process each group to create tiles
for _, group in pairs(groups) do
-- Skip clustering for special groups in unclustered mode
-- Convert configs directly to tiles without clustering
for _, config in pairs(group.unclusteredConfigs) do
local tile = context.itemToTileConverter(config, true)
-- GENERIC: Create tiles for each cluster
for _, clusteredItems in pairs(itemsClustered) do
local tiles = context.processClusteredItems(clusteredItems, group, data.displayData.clusterMode)
-- GENERIC: Add tiles to groups and handle special groups (favourites/recent)
for _, tile in pairs(tiles) do
table.insert(group.tiles, tile)
-- GENERIC: Automatic sorting based on group type and display settings
for _, group in pairs(groups) do
--print(string.format("sorting group %s with mode %s %s (in handleAllModelsPath)", group.key, data.displayData.sortMode, data.displayData.groupMode))
-- VEHICLE-SPECIFIC: Iterate through vehicle configurations
for _, config in pairs(model.configs) do
-- VEHICLE-SPECIFIC: Filter by vehicle submodel
@/lua/ge/extensions/editor/dynamicDecals/loadSave.lua
tblx = {}
for _, mode in pairs(api.loadingModes) do
table.insert(tblx, mode.key)
@/lua/vehicle/controller/advancedCouplerControl.lua
couplerNodePairData.availableCid2 = {}
for _, cid2 in pairs(cnp.cid2) do
table.insert(couplerNodePairData.availableCid2, beamstate.nodeNameMap[cid2])
@/lua/ge/extensions/flowgraph/nodes/ui/updatedUI/endScreenWhole.lua
function C:_executionStarted()
for _, p in pairs(self.pinOut) do
p.value = false
local strLinks = {}
for _, lnk in pairs(self.graph.links) do
if lnk.sourceNode == self and tableContains(self.oldOptions, lnk.sourcePin.name) then
local outPins = {}
for _, pn in pairs(self.pinOut) do
if tableContains(self.oldOptions, pn.name) then
end
for _, pn in pairs(outPins) do
self:removePin(pn)
local inPins = {}
for _, pn in pairs(self.pinInLocal) do
local contained = false
end
for _, pn in pairs(inPins) do
self:removePin(pn)
function C:buttonPushed(action)
for nm, pn in pairs(self.pinOut) do
if nm == action then
canPayFee = true
for key, value in pairs(entryFee) do
hasEntryFee = hasEntryFee or value > 0
function C:onNodeReset()
for _,pn in pairs(self.pinOut) do
pn.value = false
@/lua/ge/extensions/gameplay/crawl/saveSystem.lua
local function onSaveCurrentSaveSlot(currentSavePath)
for id, trail in pairs(M.getPlayerCrawlTrailsById()) do
if trail._dirty then
@/lua/ge/extensions/ui/liveryEditor/layers.lua
if M.layerMap then
for k, layer in pairs(M.layerMap) do
if not layer.hidden then
M.getLayerByOrder = function(order, parentUid)
for k, layerMapItem in pairs(M.layerMap) do
if (not parentUid or parentUid == layerMapItem.parentUid) and layerMapItem.order == order then
@/lua/ge/extensions/util/richPresence.lua
end
for k,v in pairs(timelineEvents) do
gameplay_statistic.callbackRegister(k, false, statCbTimeline)
end
for k,v in pairs(timelineEvents) do
gameplay_statistic.callbackRemove(k, false, statCbTimeline)
M.richPresenceEnabled = enabled
for k, v in pairs(toggleableFunctions) do
M[k] = enabled and v or nop
@/lua/vehicle/extensions/tech/impactgen/damageEvaluation.lua
for i, beam in pairs(v.data.beams) do
local id1 = beam.id1
for k, v in pairs(damage) do
damage[k] = {damage = damage[k] / beamCounts[k]}
for i, beam in pairs(v.data.beams) do
local id1 = beam.id1
for k, v in pairs(damage) do
damage[k] = {damage = damage[k]}
for i, beam in pairs(v.data.beams) do
local id1 = beam.id1
for k, v in pairs(damaged) do
damaged[k] = {damage = damaged[k] / beamCounts[k]}
for i, beam in pairs(v.data.beams) do
local id1 = beam.id1
for k, v in pairs(damage) do
damage[k] = {damage = damage[k] / beamCounts[k]}
for i, beam in pairs(v.data.beams) do
local id1 = beam.id1
for k, v in pairs(damage) do
damage[k] = {damage = damage[k]}
for i, beam in pairs(v.data.beams) do
local id1 = beam.id1
for k, v in pairs(damaged) do
damaged[k] = {damage = damaged[k] / beamCounts[k]}
for i, beam in pairs(v.data.beams) do
local id1 = beam.id1
for k, v in pairs(damage) do
damage[k] = {damage = damage[k] / beamCounts[k]}
for i, beam in pairs(v.data.beams) do
local id1 = beam.id1
for k, v in pairs(damage) do
damage[k] = {damage = damage[k]}
for i, beam in pairs(v.data.beams) do
local id1 = beam.id1
for k, v in pairs(damaged) do
damaged[k] = {damage = damaged[k] / beamCounts[k]}
for i, beam in pairs(v.data.beams) do
local part = beam.partPath
for k, v in pairs(beamCounts) do
if partData[k] ~= nil and partData[k].beamsBroken ~= nil then
local nodeProperties = {}
for k, v in pairs(v.data.nodes[id]) do
if type(v) == "string" or type(v) == "boolean" or type(v) == "number" then
local beamProperties = {}
for k, v in pairs(beam) do
if type(v) == "string" or type(v) == "boolean" or type(v) == "number" then
for i, beam in pairs(v.data.beams) do
local id1 = beam.id1
@/lua/ge/extensions/flowgraph/nodes/math/math.lua
--include all math functions and constants
for k, v in pairs(math) do
env[k] = v
--dumpz(self.graph.links,2)
for _, l in pairs(self.graph.links) do
if l.targetNode.id == self.id then
self.keyworkdWhiteListLookup = {}
for _, v in pairs(keywordWhiteList) do
self.keyworkdWhiteListLookup[v] = true
@/lua/ge/extensions/career/modules/painting.lua
local colors
for partPath, partCondition in pairs(partConditions) do
if not colors then
vehicle.config.paints = deepcopy(chosenPaints)
for partPath, partCondition in pairs(vehicle.partConditions) do
if partCondition.visualState and partCondition.visualState.paint.originalPaints then
@/lua/ge/extensions/gameplay/discover/discover_038.lua
for _, discover in pairs(freeroamExperiences) do
table.insert(D.pageInfo.sections[1].discoverIds, discover.id)
end
for _, mission in pairs(missions) do
table.insert(D.pageInfo.sections[2].discoverIds, mission.id)
@/lua/ge/extensions/core/trafficSignals.lua
local objData = self:getSignalObjects(true)
for _, objId in pairs(objData) do
if scenetree.objectExists(objId) then
self.targetPos = vec3()
for _, v in pairs(vectors) do
self.targetPos:setAdd(v)
for k, _ in pairs(vectors) do -- sets the same intersection data for all matching instances
instancesByName[k].targetPos = self.targetPos
for k, v in pairs(data) do
self[k] = v
function SignalController:onSerialize()
for _, state in pairs(self.states) do
if state.duration and state.duration < 0 then
for k, v in pairs(data) do
self[k] = v
function SignalSequence:resolveUpdates(forceUpdate) -- updates all linked signal states and lights
for _, state in pairs(self.controllerStates) do
if state._updated or forceUpdate then
local stateBase = state.controller.states[state.stateIdx]
for _, instance in pairs(state.instances) do
if instance.active then
for _, state in pairs(self.controllerStates) do
state.stateIdx = state.controller.defaultIndex or 1
local stateRef = state.controller:getStateData(stateBase.state)
for _, instance in pairs(state.instances) do
instance:setLights(stateRef and stateRef.lights)
else
for _, state in pairs(self.controllerStates) do
for _, instance in pairs(state.instances) do
for _, state in pairs(self.controllerStates) do
for _, instance in pairs(state.instances) do
signalUpdates[instance.name] = 'none'
for k, v in pairs(data) do
self[k] = v
end
for _, instance in pairs(instances) do
if not instance._invalid then
if instances[1] then
for _, instance in pairs(instances) do
instance.active = false
if active then
for stateName, stateDef in pairs(controllerDefinitions.states) do
if stateDef.flashingActive and stateDef.flashingLights then -- process flashing lights
for k, state in pairs(signalUpdates) do
signalUpdateResults[k] = {state = state}
for k, e in pairs({instances = instances, controllers = controllers, sequences = sequences}) do
data[k] = {}
_uid = 0
for k, e in pairs({instances = instances, controllers = controllers, sequences = sequences}) do
for i, v in ipairs(e) do
@/lua/ge/extensions/ui/topBar.lua
local visibleItemObjects = {}
for _, item in pairs(Config.TopBarEntries) do
local isBlacklisted = item.blackListStates and M.state.currentUIState and
local visibleItems = {}
for _, item in pairs(visibleItemObjects) do
table.insert(visibleItems, item.id)
-- check if any substate matches the state
for _, item in pairs(Config.TopBarEntries) do
if item.targetState == M.state.currentUIState then
elseif item.substates and #item.substates > 0 then
for _, substate in pairs(item.substates) do
if string.sub(M.state.currentUIState, 1, #substate) == substate then
@/lua/ge/extensions/editor/missionEditor/progressMulti.lua
for _,l in pairs(currentAggregatesByKey.labels) do
im.TableSetupColumn(l)
im.TableNextColumn()
for _, missionData in pairs(currentAggregatesByKey.rows) do
for _, c in pairs(missionData) do
for _, missionData in pairs(currentAggregatesByKey.rows) do
for _, c in pairs(missionData) do
im.Text(c.text)
@/lua/ge/extensions/editor/gen/top.lua
if rest then
for _,i in pairs(rest) do
dbase[#dbase+1] = dbasepre[i]
end
for _,i in pairs(chunk) do
dchunk[#dchunk+1] = dbasepre[i]
local af = {}
for _,c in pairs(achunk) do
af = M.zip(c, af)
-- check winding/cross-bounds
for _,p in pairs(apair) do
local ps = deepcopy(p)
local pair,mult = pairsUp(base)
for _,m in pairs(mult) do
if #m > 1 then
for _,v in pairs(ap) do
av[#av+1] = v
end
for _,v in pairs(aP) do
av[#av+1] = v
if dbg then
for i,d in pairs(adata) do
-- U.dump(d[1], '?? for_DATA:')
-- U.dump(amult, '??+++++ AMULT:')
for _,l in pairs(amult) do
if #l > 1 then return false end
for key,list in pairs(amult) do
-- lo('?? for_M:'..key..':'..#list)
if #apair == 0 then athread[#athread+1] = cthread end
for i,t in pairs(athread) do
if #t % 2 ~= 0 then
local achunk = {}
for i,t in pairs(athread) do
local cbase = {}
local cbase = {}
for _,k in pairs(t) do
cbase[#cbase+1] = base[k]
-- U.dump(cchunk, '?? for_CCHUNK:'..i)
for _,c in pairs(cchunk) do
local chunk = {}
local chunk = {}
for _,j in pairs(c) do
chunk[#chunk+1] = t[j]
local archunk = {}
for i,p in pairs(apair) do
archunk[#archunk+1] = {
for i,p in pairs(apair) do
--- get centers
-- U.dump(athread, '?? for_THREAD:')
for _,t in pairs(athread) do
local cbase = {}
local cbase = {}
for _,i in pairs(t) do
cbase[#cbase+1] = sbase[i]
-- lo('??*************** child_REM:'..#floor.top.achild, true)
for _,c in pairs(floor.top.achild) do
if c.id then
-- lo('?? fR_param:'..#achild)
for i,c in pairs(achild) do
c.id = floor.top.achild[i].id
imi = {i,j}
for _,p in pairs(apair) do
local ps = deepcopy(p)
--[[
for key,_ in pairs(noridge) do
U.dump(achunk[key], '??***************** for_chunk:'..key)
local cbase = {}
for _,i in pairs(achunk[key]) do
cbase[#cbase+1] = sbase[i]
local isin
for k,c in pairs(achunk) do
-- U.dump(c, '?? if_inchunk:'..p[1]..':'..p[2]..':'..#U.index(c,p[1]))
local b = av[#av-6+j]
-- for _,b in pairs(baseext) do
auv[#auv+1] = {u=(b-ref):dot(u), v=(b-ref):dot(v)}
local ref = base[1]
for _,b in pairs(baseext) do
auv[#auv+1] = {u=(b-ref):dot(u), v=(b-ref):dot(v)}
local ref = base[1]
for _,b in pairs(baseext) do
auv[#auv+1] = {u=(b-ref):dot(u), v=(b-ref):dot(v)}
local ajoin = {}
-- for k,p in pairs(apair) do
for k = 1,#apair-1 do
@/lua/common/jsonPrettyEncoderCustom.lua
local tableKeys = tableKeysWeightSorted(v, tableWeights)
for _, kk in pairs(tableKeys) do
local vv = v[kk]
@/lua/vehicle/powertrain/automaticGearbox.lua
local reverseGears = {}
for k, v in pairs(jbeamData.gearRatios) do
if type(k) == "number" then
local gearIndex = device.minGearIndex
for _, v in pairs(gearWhineCoefsOutput) do
device.gearWhineCoefsOutput[gearIndex] = v
local gearIndex = device.minGearIndex
for _, v in pairs(gearWhineCoefsInput) do
device.gearWhineCoefsInput[gearIndex] = v
@/lua/ge/extensions/career/modules/insurance/insurance.lua
if not data.bodyStyle then return false end
for _, bodyStyle in pairs(values) do
if data.bodyStyle[bodyStyle] then
if not data.commercialClass then return false end
for _, commercialClass in pairs(values) do
if commercialClass == data.commercialClass then
if insuranceInfo.perks then
for perkId, perkInfo in pairs(insuranceInfo.perks) do
local perkStaticData = perks[perkId]
insuranceInfo.coverageOptions.deductible.perkText = insuranceInfo.perks.reduceDeductible.intro
for coverageOptionName, coverageOptionInfo in pairs(insuranceInfo.coverageOptions.deductible.choices) do
coverageOptionInfo.oldValue = coverageOptionInfo.value
insuranceInfo.coverageOptions.paintRepair.perkText = insuranceInfo.perks.freeRepaintDuringRepair.intro
for coverageOptionName, coverageOptionInfo in pairs(insuranceInfo.coverageOptions.paintRepair.choices) do
coverageOptionInfo.oldPremiumInfluence = coverageOptionInfo.premiumInfluence
insuranceInfo.coverageOptions.roadsideAssistance.perkText = insuranceInfo.perks.freeTowing.intro
for coverageOptionName, coverageOptionInfo in pairs(insuranceInfo.coverageOptions.roadsideAssistance.choices) do
coverageOptionInfo.oldPremiumInfluence = coverageOptionInfo.premiumInfluence
insuranceInfo.coverageOptions.repairTime.perkText = insuranceInfo.perks.repairTimeDiscount.intro
for coverageOptionName, coverageOptionInfo in pairs(insuranceInfo.coverageOptions.repairTime.choices) do
coverageOptionInfo.premiumInfluence = coverageOptionInfo.premiumInfluence * (1 - repairTimeDiscountPerkValue)
insuranceInfo.coverageOptions.repairTime.perkText = insuranceInfo.perks.instantRepair.intro
for coverageOptionName, coverageOptionInfo in pairs(insuranceInfo.coverageOptions.repairTime.choices) do
if coverageOptionInfo.value > 0 then
for coverageOptionName, coverageOptionInfo in pairs(insuranceInfo.coverageOptions.roadsideAssistance.choices) do
coverageOptionInfo.choiceText = string.format("%i tows", coverageOptionInfo.value)
end
for coverageOptionName, coverageOptionInfo in pairs(insuranceInfo.coverageOptions.repairTime.choices) do
coverageOptionInfo.choiceText = coverageOptionInfo.value / 60 > 0 and string.format("%i min", coverageOptionInfo.value / 60) or "Instant"
end
for coverageOptionName, coverageOptionInfo in pairs(insuranceInfo.coverageOptions.deductible.choices) do
coverageOptionInfo.choiceText = string.format("%i$", coverageOptionInfo.value)
insuranceInfo.slogan = translateLanguage(insuranceInfo.slogan, insuranceInfo.slogan, true)
for coverageOptionName, coverageOptionInfo in pairs(insuranceInfo.coverageOptions) do
for choiceId, choiceInfo in pairs(coverageOptionInfo.choices) do --add id to each choice to make it more practical
for coverageOptionName, coverageOptionInfo in pairs(insuranceInfo.coverageOptions) do
for choiceId, choiceInfo in pairs(coverageOptionInfo.choices) do --add id to each choice to make it more practical
choiceInfo.id = choiceId
plInsurancesData = {}
for _, insuranceInfo in pairs(availableInsurances) do
plInsurancesData[insuranceInfo.id] = {
}
for gestureName, gestureInfo in pairs(insuranceInfo.gestures) do
plInsurancesData[insuranceInfo.id].gesturesData[gestureName] = {
end
for coverageOptionName, coverageOptionInfo in pairs(insuranceInfo.coverageOptions) do
if availableCoverageOptions[coverageOptionName].isInsuranceWide then
-- convert string keys to numbers
for k, v in pairs(savedPlInsuranceData.invVehs) do
invVehs[tonumber(k) or k] = v
for partPath, info in pairs(data.partConditions) do
if info.integrityValue then
-- keep the fuel level
for _, tankData in pairs(info.integrityState.energyStorage) do
for attributeName, value in pairs(tankData) do
for _, tankData in pairs(info.integrityState.energyStorage) do
for attributeName, value in pairs(tankData) do
if attributeName ~= "storedEnergy" then
local totalCost = 0
for _, cost in pairs(costs) do
totalCost = totalCost + cost
if not score then score = plDriverScore end
for _, tierData in pairs(driverScoreTiers) do
if score >= tierData.min and score <= tierData.max then
if repairOptionData.cost then
for _, cost in pairs(repairOptionData.cost) do
totalCost = totalCost + cost
for coverageOptionId, coverageOptionValueId in pairs(currentCoverageOptions) do
table.insert(coverageOptionsData, sanitizeCoverageOption(insuranceId, coverageOptionId, invVehId))
local invVehList = {}
for invVehId, data in pairs(invVehs) do
if data.insuranceId == insuranceId then
local invVehList = {}
for invVehId, data in pairs(invVehs) do
if availableInsurances[data.insuranceId] and availableInsurances[data.insuranceId].class == classId then
local sendDataToUI = false
for _, invVehInsuranceData in pairs(invVehs) do
if invVehInsuranceData.insuranceId > 0 then
local plInsuranceData = plInsurancesData[activeInsuranceId]
for gestureName, _ in pairs(insuranceData.gestures) do -- every gesture is based on driven distance for now
local lastHappenedAt = plInsuranceData.gesturesData[gestureName].lastHappenedAt or 0
local insurances = {}
for _, insuranceInfo in pairs(availableInsurances) do
if insuranceInfo.class == class then
if conditionData.jsonInsuranceClass then
for className, value in pairs(conditionData.jsonInsuranceClass) do
if value == true then
for _, classInfo in pairs(availableClasses) do
if classInfo.applicableConditions then
if classInfo.applicableConditions then
for condition, values in pairs(classInfo.applicableConditions.conditions) do -- that's an or condition
if conditions[condition](conditionData, values) then
local totalValue = 0
for _, invVehData in pairs(getInvVehsUnderInsurance(insuranceId)) do
if invVehData.initialValue then
-- find the tier that the total value falls into
for _, tier in pairs(groupDiscountTiers) do
if tier.max then
for coverageOptionId, coverageOptionData in pairs(potentialCoverageOptions or availableInsurances[insuranceId].coverageOptions) do
if not availableCoverageOptions[coverageOptionId].isInsuranceWide then
-- Insured vehicle: use current coverage options
for coverageOptionId, coverageOptionValueId in pairs(potentialCoverageOptions or invVeh.insuranceData.coverageOptionsData.currentCoverageOptions) do
totalDiscount = totalDiscount * availableInsurances[insuranceId].coverageOptions[coverageOptionId].choices[coverageOptionValueId].premiumInfluence
for _, invVehData in pairs(getInvVehsUnderInsurance(insuranceId)) do
hasVehicles = true
if hasVehicles then
for coverageOptionName, coverageOptionValueId in pairs(potentialCoverageOptions or plInsurancesData[insuranceId].coverageOptionsData.currentCoverageOptions) do
local coverageOption = availableInsurances[insuranceId].coverageOptions[coverageOptionName]
for detailName, detailPrice in pairs(details.items) do
details.totalPrice = details.totalPrice + detailPrice.price
local totalValue = 0
for _, invVehData in pairs(getInvVehsUnderInsurance(insuranceId)) do
if invVehData.initialValue then
for _, invVehData in pairs(carsInsured) do
invVehData.insuranceData.currentPremiumPrice = calculateVehiclePremium(invVehData.id).cost
local count = 0
for _, invVehData in pairs(invVehs) do
if invVehData.insuranceId > 0 then
local applicableInsurances = getInsurancesByClass(context.insuranceClassId)
for _, insuranceInfo in pairs(applicableInsurances) do
local sanitizedData
-- format the data to make it easier to use in the UI
for invVehId, invVehData in pairs(invVehs) do
local invVehTileData = career_modules_inventory.getVehicleUiData(invVehId)
for classId, classData in pairs(availableClasses) do
local carsInsured = #getInvVehsUnderClass(classId)
}
for _, insuranceInfo in pairs(getInsurancesByClass(classId)) do
table.insert(data.plClassesData[classId].insurances, getInsuranceSanitizedData(insuranceInfo.id))
-- set the default vehicle specific coverage options
for coverageOptionName, coverageOptionValue in pairs(availableInsurances[newInsuranceId].coverageOptions) do
if not availableCoverageOptions[coverageOptionName].isInsuranceWide then
if #getInvVehsUnderInsurance(newInsuranceId) == 0 then
for coverageOptionName, coverageOptionValue in pairs(availableInsurances[newInsuranceId].coverageOptions) do
if availableCoverageOptions[coverageOptionName].isInsuranceWide then
local function changeInvVehInsuranceCoverageOptions(invVehId, changedCoverageOptions)
for coverageOptionName, coverageOptionValue in pairs(changedCoverageOptions) do
local coverageOptionValueIndex = tableFindKey(availableInsurances[invVehs[invVehId].insuranceId].coverageOptions[coverageOptionName].changeability.changeParams.choices, coverageOptionValue)
-- collect all insurances that match the class
for _, insuranceInfo in pairs(availableInsurances) do
if insuranceInfo.class == insuranceClassId then
@/lua/ge/extensions/flowgraph/nodes/ui/missionPopup.lua
function C:_executionStarted()
for _, p in pairs(self.pinOut) do
p.value = false
function C:_executionStarted()
for _, p in pairs(self.pinOut) do
p.value = false
function C:buttonPushed(action)
for nm, pn in pairs(self.pinOut) do
self.pinOut[nm].value = nm == action
self:reset()
for _,pn in pairs(self.pinOut) do
pn.value = false
@/lua/ge/extensions/gameplay/markers/crawlMarker.lua
end
for key, poisInCluster in pairs(poisByObjectNames) do
local cm = poisInCluster[1].markerInfo.crawlMarker
@/lua/common/extensions/ui/imguiWire.lua
extensions.load('ui_imgui')
for k, v in pairs(ui_imgui) do
funcWrap(k)
@/lua/ge/extensions/career/modules/uiUtils.lua
for _, br in pairs(career_branches.getSortedBranches()) do
if not br.isSkill then
@/lua/ge/extensions/editor/roadUtils.lua
for k,filename in pairs(roadTemplateFiles) do
local jsonData = jsonReadFile(filename)
local allRoadsCopy = shallowcopy(editor.getAllRoads())
for roadID, _ in pairs(allRoadsCopy) do
local road = scenetree.findObjectById(roadID)
@/lua/ge/extensions/flowgraph/nodes/ui/imgui/elemental/imSeparator.lua
function C:_executionStarted()
for _, p in pairs(self.pinOut) do
p.value = false
@/lua/ge/extensions/flowgraph/nodes/ui/customUiLayout.lua
local sorted = {}
for key, layout in pairs(layouts) do
if type(layout) == "table" and #layout > 0 then
@/lua/vehicle/controller/tech/roadsSensor.lua
local cands, c2Ctr = {}, 1
for k, _ in pairs(graph[p_frontKey]) do
cands[c2Ctr] = k
local cands1, c1Ctr = {}, 1
for k, _ in pairs(graph[p1Key]) do
cands1[c1Ctr] = k
local cands2, c2Ctr = {}, 1
for k, _ in pairs(graph[p2Key]) do
cands2[c2Ctr] = k
graph, coords, widths = mapData.graph, mapData.positions, mapData.radius
for k, v in pairs(coords) do
normals[k] = mapmgr.surfaceNormalBelow(v)
local wp, ctr = {}, 1
for _, wheel in pairs(wheels.wheels) do
wp[ctr] = obj:getNodePosition(wheel.node1)
@/lua/ge/extensions/core/input/bindings.lua
local testedKeys = {}
for k1, v1 in pairs(t1) do
local v2 = t2[k1]
end
for k2, v2 in pairs(t2) do
if not testedKeys[k2] then
local result = deepcopy(binding)
for k, v in pairs(defaultBinding) do
if deepcompare(result[k],v) then
local count = 0
for i,binding in pairs(bindings) do
if binding.unused then
end
for k,v in pairs(fileData or {}) do
if k == "bindings" then
if list == nil then return result end
for _,v in pairs(list) do
if v.action == nil then log("W", "bindings", "Binding is missing the 'action' field: " ..dumpbinding(v)) end
local result = { bindings = {}, removed = {}, version = 1 }
for k,v in pairs(old) do
if k ~= "bindings" and k ~= "removed" then result[k] = v end
local markedForRemoval = {}
for k,v in pairs(dictOld) do
if dictNew[k] == nil then
-- process removed bindings
for k,v in pairs(markedForRemoval) do
log('D', 'bindings', "Removed binding (added to list): "..dumps(v.control).." : "..dumps(v.action))
-- process modified/new bindings
for k,v in pairs(dictNew) do
if dumps(dictOld[k]) ~= dumps(v) then
local function applyResponseCurve(contents, path, curveInverted)
for i,binding in pairs(contents.bindings) do
if binding.ffb and binding.ffb.responseCorrected then
if not allowDuplicates then
for k,v in pairs(dictDiffReplaced) do
for kk,vv in pairs(dictBase) do
for k,v in pairs(dictDiffReplaced) do
for kk,vv in pairs(dictBase) do
if vv.control == v.control then
-- merge removed bindings
for k,v in pairs(dictDiffRemoved) do
if dictBase[k] == nil then
-- merge new/modified bindings
for k,v in pairs(dictDiffReplaced) do
dictBase[k] = v
local bindings = {}
for _,v in pairs(dictBase) do table.insert(bindings, cleanBindingDefaults(v)) end
-- now check for removed devices
for device,_ in pairs(oldDevices) do
if newDevicesSet[device] == nil then
local enabledActionsMap = {}
for _, t in pairs(vd.vdata.actionsEnabled) do
enabledActionsMap[t.name] = true
-- fill/rewrite metadata (all except bindings themselves: guid, devtype...)
for k,v in pairs(vehicleContents) do
if k ~= "bindings" then contents[k] = v end
local currentActions = {}
for actionName,action in pairs(core_input_actions.getActiveActions()) do
if action.vehicle == nil or action.vehicle == vehicleName then
actionToControl = nil
for i,s in pairs(ActionMap:getList())do
for j,v in ipairs(s) do
local vd = extensions.core_vehicle_manager.getVehicleData(veh:getId())
for _, actionList in pairs(vd and vd.vdata and vd.vdata.triggerEventLinksDict or {}) do
for _, linkList in pairs(actionList) do
for _, actionList in pairs(vd and vd.vdata and vd.vdata.triggerEventLinksDict or {}) do
for _, linkList in pairs(actionList) do
for _, lnk in pairs(linkList) do
for _, linkList in pairs(actionList) do
for _, lnk in pairs(linkList) do
if lnk.namespace == 'common' then
lnk.inputAction = core_input_actions.upgradeAction(lnk.inputAction)
for actionName, action in pairs(activeActions) do
if actionName == lnk.inputAction then
for _,data in pairs(M.bindings) do
sendBindingsToGE(data.devname, data.contents.bindings, M.assignedPlayers[data.devname])
-- remove the "unused" flag from the bindings for comparing and writing to disk
for k,v in pairs(defaultData.bindings) do v.unused = nil end
for k,v in pairs(data.bindings) do v.unused = nil end
for k,v in pairs(defaultData.bindings) do v.unused = nil end
for k,v in pairs(data.bindings) do v.unused = nil end
-- convert from vehicle__actionname to actionname. this name-mangling is needed to prevent collisions with other vehicles' action names
for _,b in pairs(diffData.bindings or {}) do b.action = core_input_actions.uniqueNameToName(b.action, vehicleName) end
for _,b in pairs(diffData.removed or {}) do b.action = core_input_actions.uniqueNameToName(b.action, vehicleName) end
for _,b in pairs(diffData.bindings or {}) do b.action = core_input_actions.uniqueNameToName(b.action, vehicleName) end
for _,b in pairs(diffData.removed or {}) do b.action = core_input_actions.uniqueNameToName(b.action, vehicleName) end
-- normal bindings
for devname,info in pairs(M.devices) do
if resetAllDevices or devname == desiredDevName then
-- vehicle specific bindings
for devname,info in pairs(M.devices) do
if resetAllDevices or devname == desiredDevName then
setMenuActionEnabled(enabled, nil, "MenuActionMap")
for menuActionMapName,_ in pairs(core_input_actions.menuActionMapNames) do
setMenuActionEnabled(enabled, nil, menuActionMapName)
@/lua/ge/extensions/editor/vehicleEditor/staticEditor/veJBeamSpellchecker.lua
local function analyzeJBeamFile(filePath, fileName, jbeamFileData)
for parts, partData in pairs(jbeamFileData) do
for section, sectionData in pairs(partData) do
for parts, partData in pairs(jbeamFileData) do
for section, sectionData in pairs(partData) do
--if section == 'beams' or section == 'nodes' or section == 'triangles' or section == 'flexbodies' or section == 'props' or section == 'torsionbars' then
if mods then
for modifier, _ in pairs(mods) do
if not allSections[section][modifier] then
if mods then
for modifier, _ in pairs(mods) do
if not allSections.beams[modifier] then
@/lua/vehicle/powertrain/linearActuator.lua
device.actuatorBeams = {}
for _, tag in pairs(beamTags) do
local beamCids = beamstate.tagBeamMap[tag]
if beamCids then
for _, beamCid in pairs(beamCids) do
table.insert(device.actuatorBeams, beamCid)
@/lua/ge/extensions/tech/platoonFunctions.lua
local function printPlatoons()
for leaderID, platoon in pairs(platoons) do
for i, vehicleID in ipairs(platoon.vehicles) do
for platoonID, platoon in pairs(platoons) do -- Loop over all platoons
for i, vehicleID in ipairs(platoon.vehicles) do -- Loop over vehicles (index-based)
sensorData = extensions.tech_sensors.getUltrasonicReadings(sensorID)
for k, v in pairs(sensorData) do
if k == "distance" then
@/lua/ge/extensions/flowgraph/utils.lua
local sortedString = {}
for name, val in pairs(mergeFunctionsAll) do
mergeFunctionsAny[name] = val
end
for name, val in pairs(mergeFunctionsNumber) do
mergeFunctionsAny['num_'.. name] = val
end
for name, val in pairs(mergeFunctionsBool) do
mergeFunctionsAny['bool_'.. name] = val
end
for name, val in pairs(mergeFunctionsVec) do
mergeFunctionsAny['vec_'.. name] = val
end
for name, val in pairs(mergeFunctionsString) do
mergeFunctionsAny['any_'.. name] = val
@/lua/vehicle/scriptai.lua
local avgWheelNodePos, numOfWheels, maxWheelRadius = vec3(), 0, -math.huge
for _, wheel in pairs(wheels.wheels) do
avgWheelNodePos:setAdd(obj:getOriginalNodePositionRelative(wheel.node1))
@/gameplay/missions/gridmap_v2/collection/002-blenderbowl/script.lua
-- Loop through all spinners and update their timers
for id, timer in pairs(spinnerTimers) do
timer = timer + dtSim
@/lua/ge/extensions/flowgraph/modules/actionModule.lua
local list = {}
for k, v in pairs(self.actionsByName) do
table.insert(list, k)
@/lua/ge/extensions/editor/rallyEditor/pacenotes/pacenoteForm.lua
local keys = {}
for k,v in pairs(RallyEnums.slowCornerReleaseTypeName) do
table.insert(keys, k)
local keys = {}
for k,v in pairs(RallyEnums.triggerTypeName) do
table.insert(keys, k)
@/lua/ge/extensions/editor/scriptAIEditor.lua
local out = {}
for id, tr in pairs(trajectories) do
out[id] = ptr2ValTraj(tr)
table.clear(trajectories)
for id, tr in pairs(data) do
trajectories[id] = val2PtrTraj(tr)
local function detachTrajectory(str)
for k, tr in pairs(trajectories) do
if tr.vehicle == str then
local polyLinesToExecute = {} -- First, format all the trajectories so they can be run by the scriptAI backend.
for k, tr in pairs(trajectories) do
if tr.vehicle ~= "" and tr.vid ~= nil then
end
for vid, p in pairs(polyLinesToExecute) do -- Execute all the vehicle trajectories using the scriptAI backend.
scenetree.findObject(vid):queueLuaCommand('ai.startFollowing(' .. serialize(p) .. ')')
local function stopExecute()
for k, tr in pairs(trajectories) do -- Stop executing all the vehicle scripts.
local vid = tr.vid
local vehicles, numTrajectories, numVehicles = data.vehicles, 0, 0 -- Compute valid starting positions for all the vehicles which are to be spawned.
for k, tr in pairs(trajectories) do
numTrajectories = numTrajectories + 1
end
for k, tr in pairs(vehicles) do
numVehicles = numVehicles + 1
local ctr = 1
for k, tr in pairs(trajectories) do
local polyLine = tr.polyLine
local ctr = 1 -- Spawn all the vehicles which are required.
for k, data in pairs(vehicles) do
local _ = core_vehicles.spawnNewVehicle(data.jBeam, { pos = spawnPositions[ctr], config = data.config })
local alreadyAttachedVehicles = {}
for id, tr in pairs(trajectories) do
local vehicle = tr.vehicle
end
for k, v in pairs(d.ratios) do -- Project each time position to the mouse-controlled interval.
if k ~= lLock and k ~= uLock then
local isHovered = false
for k, tr in pairs(trajectories) do
local boxData = tr.boxData
local dClosest, trClosest, nClosest = 1e30, nil, nil
for id, tr in pairs(trajectories) do
if tr.isDisplay[0] == true then
-- Iterate over the full array of trajectories and ignore those which are not marked for display.
for k, tr in pairs(trajectories) do
local c = tr.col
local numTrajectories = 0
for k, tr in pairs(trajectories) do
numTrajectories = numTrajectories + 1
toolWinData.tStart, toolWinData.tEnd = 0.0, 0.0
for k, tr in pairs(trajectories) do
local polyLine = getPolyRef(tr)
if editor.uiIconImageButton(editor.icons.watch_later, im.ImVec2(28, 28), nil, nil, nil, 'normalizeTrajectory') then
for k, tr in pairs(trajectories) do
local poly = getPolyRef(tr)
local vehicleAttachState = "[not attached]"
for k, tr in pairs(trajectories) do
if tr.vehicle ~= nil and tr.vehicle == vehicle.string then
table.remove(sceneVehicles, i)
for tIdx, tr in pairs(trajectories) do
if tr.vid == selectedVehicle.vid then
local idx = nil
for k, tr in pairs(trajectories) do
if vehicle.vid == tr.vid then
if im.BeginListBox("", im.ImVec2(170, 180), im.WindowFlags_ChildWindow) then
for k, tr in pairs(trajectories) do
im.Columns(3, "columns3", false)
local numTrajectories = 0
for k, tr in pairs(trajectories) do
numTrajectories = numTrajectories + 1
end
for k, tr in pairs(trajectories) do
if tr.vid == vid then
@/lua/ge/extensions/gameplay/speedTraps.lua
local res = {}
for _, obj in pairs(objs) do
if obj.speedTrapType == speedTrapType then
@/lua/vehicle/extensions/api.lua
local data = {}
for vk,vs in pairs(data_ref) do
data[vk] = {}
-- for nodeid, beamnid
for _,vv in pairs(vs) do
data[vk][vv.cid] = {}
data[vk][vv.cid] = {}
for vk,vi in pairs(vv) do
if whitelist[vk] then
local tris = {}
for k, s in pairs(v.data.beams) do
if not s.wheelID then
end
for k, s in pairs(v.data.nodes) do
if not s.wheelTreadBeamDeform then
end
for k, s in pairs(v.data.triangles) do
if s.cid then
@/lua/vehicle/powertrain/combustionEngine.lua
for k, v in pairs(device.torqueCurve) do
if type(k) == "number" and k < maxRPM then
for k, v in pairs(device.torqueCurve) do
if type(k) == "number" and k < maxRPM then
for k, v in pairs(device.torqueCurve) do
if type(k) == "number" and k < maxRPM then
for k, v in pairs(device.torqueCurve) do
if type(k) == "number" and k < maxRPM then
for k, v in pairs(device.torqueCurve) do
if type(k) == "number" and k < maxRPM then
for k, v in pairs(device.torqueCurve) do
if type(k) == "number" and k < maxRPM then
for k, v in pairs(device.torqueCurve) do
if type(k) == "number" and k < maxRPM then
for k, v in pairs(device.torqueCurve) do
if type(k) == "number" and k < maxRPM then
local function updateEnergyStorageRatios(device)
for _, s in pairs(device.registeredEnergyStorages) do
local storage = energyStorage.getStorage(s)
local remainingFuelRatio = 0
for _, s in pairs(device.registeredEnergyStorages) do
local storage = energyStorage.getStorage(s)
local nodeCids = {}
for _, nodePair in pairs(exhaustNodeIDPairs) do
table.insert(nodeCids, nodePair[2])
local nodeCids = {}
for _, nodePair in pairs(exhaustNodeIDPairs) do
table.insert(nodeCids, nodePair[2])
endNodeIDPairs = {}
for _, v in pairs(endNodes) do
maxExhaustAudioOpennessCoef = min(max(maxExhaustAudioOpennessCoef, v.exhaustAudioOpennessCoef), 1)
bdebug.clearTypeNodeDebugText("CombustionEngine " .. device.name)
for _, soundData in pairs(device.soundLocations) do
for _, nodeCid in ipairs(soundData.nodes) do
endNodeIDPairs = {}
for _, v in pairs(device.thermals.exhaustEndNodes) do
maxExhaustAudioOpennessCoef = min(max(maxExhaustAudioOpennessCoef, v.exhaustAudioOpennessCoef), 1)
endNodeIDPairs = {}
for _, v in pairs(exhaustEndNodes) do
maxExhaustAudioOpennessCoef = min(max(maxExhaustAudioOpennessCoef, v.exhaustAudioOpennessCoef), 1)
local hasValidReactioNodes = true
for _, v in pairs(torqueReactionNodes_nodes) do
if type(v) ~= "number" then
local maxAvailableRPM = 0
for _, v in pairs(baseTorqueTable) do
maxAvailableRPM = max(maxAvailableRPM, v.rpm)
local rawTorqueMultPoints = {}
for _, v in pairs(multTorqueTable) do
maxAvailableRPM = max(maxAvailableRPM, v.rpm)
local rawIntakePoints = {}
for _, v in pairs(intakeTorqueTable) do
maxAvailableRPM = max(maxAvailableRPM, v.rpm)
local rawExhaustPoints = {}
for _, v in pairs(exhaustTorqueTable) do
maxAvailableRPM = max(maxAvailableRPM, v.rpm)
local rawPoints = {}
for _, v in pairs(compressionBrakeTorqueTable) do
maxAvailableRPM = max(maxAvailableRPM, v.rpm)
tempBurnEfficiencyTable = {}
for k, v in pairs(copy) do
if type(k) == "number" then
device.invBurnEfficiencyCoef = 1
for k, v in pairs(tempBurnEfficiencyTable) do
device.invBurnEfficiencyTable[k] = 1 / v
@/lua/vehicle/hydros.lua
table.insert(rCurve, 1, {0,0})
for i, p in pairs(rCurve) do
p[1] = p[1]/maxx
for k, f in pairs(inputFlex) do
local eval = electrics.values[k]
if v.data.hydros then
for _, h in pairs(v.data.hydros) do
h.fIsBroken = obj.beamIsBroken
if v.data.torsionHydros then
for _, h in pairs(v.data.torsionHydros) do
h.fIsBroken = obj.torsionbarIsBroken
for _, h in pairs(M.hydros) do
h.inputCenter = h.inputCenter * h.inputFactor
table.clear(poweredWheelIndices)
for index, wheel in pairs(wheels.wheels) do
if poweredWheelNames[wheel.name] then
for _,h in pairs(M.hydros) do
h.state = h.center + 1e-28 -- so as it initializes correctly
@/lua/ge/extensions/editor/vehicleEditor/staticEditor/veJBeamBeautifier.lua
for partName, part in pairs(luaDataRaw) do
if partName ~= '__astNodeIdx' then
local astIdxToPart = {}
for partName, part in pairs(luaDataRaw) do
if partName ~= '__astNodeIdx' then
local testedKeys = {}
for k1, v1 in pairs(t1) do
local v2 = t2[k1]
end
for k2, v2 in pairs(t2) do
if not testedKeys[k2] then
@/lua/ge/extensions/editor/missionPlaybook/attributeViewer.lua
local data = {}
for key, val in pairs(atts) do
local level, curLvlProgress, neededForNext = career_branches.getBranchLevel(key)
@/lua/ge/extensions/editor/toolUtilities/geom.lua
-- Check each graph node in turn.
for key, node in pairs(nodes) do
local a, b = intersectsRay_Sphere(rayPos, rayDir, node, mouseToNodetol) -- Get any intersection points between the ray and node sphere.
@/lua/ge/extensions/gameplay/parking.lua
for id, data in pairs(trackedVehData) do
local valid, pData = trackParking(id)
@/lua/console/resave-pcs.lua
local configCount = 0
for _,vdir in pairs(vehicles) do
--do we have a vehicle that is known to fail on spawning?
if #configs == 0 then goto skipme end
for _,config in pairs(configs) do
io.write("\tresaving config " .. config .. "\n")
@/lua/ge/extensions/editor/crawlEditor/presets.lua
local presetList = {}
for name, preset in pairs(self.presets.categories[self.PRESET_CATEGORIES.BOUNDARIES]) do
table.insert(presetList, {name = name, preset = preset})
local presetList = {}
for name, preset in pairs(self.presets.categories[self.PRESET_CATEGORIES.PATHNODES]) do
table.insert(presetList, {name = name, preset = preset})
local presetList = {}
for name, preset in pairs(self.presets.categories[self.PRESET_CATEGORIES.TRAILS]) do
table.insert(presetList, {name = name, preset = preset})
@/lua/vehicle/extensions/inputAnalyzer.lua
local function checkInput(dt)
for k, v in pairs(iV) do
lastInputs[k] = inputs[k]
local keyPressed = false
for k, v in pairs(inputs) do
if v and v ~= lastInputs[k] then
if keyPressed then
for k, v in pairs(inputs) do
if v and v ~= lastInputs[k] then
@/lua/ge/extensions/gameplay/drag/display.lua
-- Check if at least one light object exists
for _, light in pairs(laneTree.stageLights) do
if light and light.obj then
end
for _, light in pairs(laneTree.countDownLights) do
if light and light.obj then
for _, laneTree in ipairs(dragData.strip.treeLights) do
for _,group in pairs(laneTree) do
if type(group) == "table" then
if type(group) == "table" then
for _,light in pairs(group) do
if type(light) == "table" and light.obj and simObjectExists(light.obj) then
if not dragData then return end
for _, digitTypeData in pairs(dragData.strip.displayDigits) do
for _,laneTypeData in ipairs(digitTypeData) do
for vehId, racer in pairs(dragData.racers) do
if racer.isPlayable then
for vehId, racer in pairs(dragData.racers) do
-- Send times to UI continuously if display signs are not available and racer is in race phase
for _, laneTree in ipairs(dragData.strip.treeLights) do
for _, group in pairs(laneTree) do
if type(group) == "table" then
if type(group) == "table" then
for _, light in pairs(group) do
if type(light) == "table" and light.obj and simObjectExists(light.obj) then
end
for _, digitTypeData in pairs(dragData.strip.displayDigits) do
for _, laneTypeData in ipairs(digitTypeData) do
for _, laneTree in ipairs(dragData.strip.treeLights) do
for _, group in pairs(laneTree) do
if type(group) == "table" then
if type(group) == "table" then
for _, light in pairs(group) do
if type(light) == "table" and light.obj and simObjectExists(light.obj) then
end
for _, digitTypeData in pairs(dragData.strip.displayDigits) do
for _, laneTypeData in ipairs(digitTypeData) do
for _, laneTree in ipairs(dragData.strip.treeLights) do
for _, group in pairs(laneTree) do
if type(group) == "table" then
if type(group) == "table" then
for _, light in pairs(group) do
if type(light) == "table" and light.obj and simObjectExists(light.obj) then
end
for _, digitTypeData in pairs(dragData.strip.displayDigits) do
for _, laneTypeData in ipairs(digitTypeData) do
for _, laneTree in ipairs(dragData.strip.treeLights) do
for _, group in pairs(laneTree) do
if type(group) == "table" then
if type(group) == "table" then
for _, light in pairs(group) do
if type(light) == "table" and light.obj and simObjectExists(light.obj) then
end
for _, digitTypeData in pairs(dragData.strip.displayDigits) do
for _, laneTypeData in ipairs(digitTypeData) do
@/lua/ge/extensions/flowgraph/modules/fileModule.lua
function C:afterTrigger()
for file, _ in pairs(self.changed) do
local p = savePath .. file .. ext
@/lua/common/libs/luasocket/socket/url.lua
local parsed = {}
for i,v in base.pairs(default or parsed) do parsed[i] = v end
-- empty url is parsed to nil
@/lua/ge/extensions/flowgraph/nodes/scene/sevensegmentDisplay.lua
function C:clearObjects()
for _, obj in pairs(self.objects) do
if obj then
@/lua/ge/extensions/ui/gridSelectorUtils/filterModule.lua
-- Check if any option for this property is locked
for _, _ in pairs(lockedFiltersByProp[propName]) do
return true
-- Fallback to iterating through keys if no options structure in filterList
for key, _ in pairs(filterOptions) do
if key ~= 'min' and key ~= 'max' then
-- Preserve locked filters when updating
for propName, lockedOptions in pairs(lockedFiltersByProp) do
if newFilters[propName] then
-- For set filters, preserve locked options
for option, lockedValue in pairs(lockedOptions) do
if newFilters[propName][option] ~= nil then
if filterByProp[propName] then
for option, value in pairs(filterByProp[propName]) do
lockedFiltersByProp[propName][option] = value
local hasLockedOptions = false
for _, _ in pairs(lockedFiltersByProp[propName]) do
hasLockedOptions = true
if options then
for option, enabled in pairs(options) do
if filterByProp[propName][option] ~= nil then
@/lua/common/jbeam/utils.lua
for nodeKey, data in pairs(jbeamData) do
if type(nodeKey) == 'string' and type(data) == 'table' and type(data.x) == 'number' and type(data.y) == 'number' and type(data.z) == 'number'
@/lua/ge/extensions/flowgraph/nodes/gameplay/recoveryPrompt/setRecoveryPromptLimit.lua
local counts = {}
for name, pin in pairs(self.pinInLocal) do
if self.pinIn[name].value ~= nil and pin.type == 'number' then
@/lua/ge/extensions/core/vehicleMirrors.lua
local mirrorCamPos = vec3()
for _, m in pairs(vehicleMirrorData) do
local id1 = vec3(veh:getNodePosition(m.id1))
-- add some more stuff
for _, m in pairs(vehicleMirrorData) do
m.userCorrection = vec3()
@/lua/ge/extensions/flowgraph/nodes/gameplay/race/raceNodeReached.lua
for name, pin in pairs(self.pinOut) do
if not pin.fixed then
self.pinOut.nodeName.value = nil
for name, pin in pairs(self.pinOut) do
if not pin.fixed then pin.value = nil end
@/lua/vehicle/controller/propAnimation/dualAxisLever.lua
local modeId = 1
for _, coordinate in pairs(modeCoordinateTable) do
modeCoordinates[coordinate.modeName] = {x = coordinate.x, y = coordinate.y, position = modeId}
local impulseModeCoordinateTable = tableFromHeaderTable(jbeamData.impulseModeCoordinates or {})
for _, impulseMode in pairs(impulseModeCoordinateTable) do
--we only support modes here with a length of at least 2
for _, modeChange in pairs(modeChangesTable) do
local index1 = modeChange.mode1 .. modeChange.mode2
modeChanges[index2] = {}
for _, pos in pairs(modeChange.intermediateCoordinates) do
--normal order as per jbeam
@/lua/ge/extensions/editor/tech/roadArchitect/roads.lua
local startWidth = nil
for k, v in pairs(n.widths) do
if r.profile[k].type == 'road_lane' then
local laneWidth = max(0.5, min(10.0, startWidth + offset))
for k, _ in pairs(n.widths) do
if r.profile[k].type == 'road_lane' then
@/lua/ge/extensions/flowgraph/nodes/ui/contextTranslation.lua
for nm, pin in pairs(self.pinInLocal) do
if nm ~= 'flow' and nm ~= 'translationString' then
if self.variablesState == 2 then
for nm, pin in pairs(self.pinInLocal) do
if nm ~= 'flow' and nm ~= 'translationString' then
@/lua/ge/extensions/editor/gen/render.lua
if true then
for _,pth in pairs(apath) do
Render.path(pth, ColorF(c[1],c[2],c[3],c[4] or 1), w, true, z)
local n = 0
for _,pth in pairs(apath) do
for i=1,#pth-1 do
local campos = core_camera.getPosition()
for _,pos in pairs(set) do
-- print('?? set:'..tostring(pos)..':'..tostring(campos)..':'..tostring(c))
c = ColorF(c[1],c[2],c[3],c[4] or 1)
for _,s in pairs(list) do
-- print('?? label:'..tostring(s[2])..':'..tostring(s[1]))
@/lua/common/settings.lua
local result = {}
for originalSetting,v in pairs(settings) do
local setting = upgradeSetting(originalSetting)
M.internalValues = upgradeSettings(internalValues)
for k,v in pairs(M.internalValues) do
local definition = M.defaults[k]
steamdeckValues = upgradeSettings(steamdeckValues)
for k,v in pairs(steamdeckValues) do
local definition = M.defaults[k]
M.defaultValues = {}
for k,v in pairs(M.defaults) do
M.defaultValues[k] = v[2]
if CppSettings then
for k,value in pairs(values) do
if CppSettings[k] ~= nil then
@/lua/ge/extensions/career/modules/branches/leagues.lua
M.clearLeagueUnlockCache = function()
for _, league in pairs(leaguesById) do league._unlocked = nil end
starsBySkillCache = {}
local ret = {}
for id, _ in pairs(leaguesById) do
ret[id] = M.isLeagueUnlocked(id)
local validSkills = {}
for _, skill in pairs(career_branches.getBranches()) do
if skill.parentBranch == condition.branchId then
local ret = {}
for id, l in pairs(leaguesById) do
local league = formatLeague(l)
local ret = {}
for id, l in pairs(leaguesById) do
if not before[id] and after[id] then
local ret = {}
for id, l in pairs(leaguesById) do
if tableContains(l.missions, missionId) then
local leaguesBySkill = {}
for id, league in pairs(leaguesById) do
if not leaguesBySkill[league.skillId] then
-- Sort leagues within each skill group
for skillId, skillLeagues in pairs(leaguesBySkill) do
-- First sort by skill stars and file order
local dirtyFilesById = {}
for id, league in pairs(leaguesById) do
local validMissionIds = {}
end
for mId, m in pairs(missionsById) do
local lMap = {}
for skillId, list in pairs(missionIdsBySkillWithoutLeague) do
local fallbackLeagueId = "fallback_"..skillId
log("W","","Some ("..tostring(dirty)..") missions were not set up properly for leagues.")
for mId, count in pairs(dirtyFilesById) do
log("W","","Mission " .. mId .. " was not set up properly for leagues " .. count .. " times.")
loadLeagues()
for _, spot in pairs(spotsById) do
spot._isInLeague = nil
end
for id, league in pairs(leaguesById) do
for _, dsId in ipairs(league.driftSpots) do
@/lua/vehicle/controller/playerController.lua
local function debugDraw(focusPos)
for _, v in pairs(debugVectors) do
obj.debugDrawProxy:drawNodeVector3d(v.thickness or 0.05, v.cid, v.vector, v.color)
isTouchingGround = false
for nodeCid, _ in pairs(ballNodes) do
isTouchingWater = isTouchingWater or obj:inWater(nodeCid)
for _, beam in pairs(v.data.beams) do
if beam.tag == jbeamData.stabilizationBeamFront then
for _, node in pairs(v.data.nodes) do
if node.tag == "ball" then
@/lua/ge/extensions/gameplay/missions/missionTypes/baseMission.lua
o:init()
for k, v in pairs(derivedClass) do
o[k] = v
@/lua/ge/extensions/tech/ultrasonicTest.lua
local ctr = 0
for i, s in pairs(activeUltrasonicSensors) do
ctr = ctr + 1
for k, v in pairs(sensorData) do
print("ultrasonic reading: "..k.." reading value: "..v)
@/lua/ge/extensions/freeroam/bigMapMarkers.lua
local newOldMarkers = {}
for clusterId, marker in pairs(oldMarkersByClusterId) do
if not marker.visible then
-- Move current markers to old markers list for gradual cleanup
for clusterId, marker in pairs(markersByClusterId) do
marker:hide()
local markersToRemove = {}
for clusterId, marker in pairs(oldMarkersByClusterId) do
marker:update(updateData)
local function hideMarkers()
for _, marker in pairs(markersByClusterId) do
marker:hide()
-- Also hide old markers
for _, marker in pairs(oldMarkersByClusterId) do
marker:hide()
print("Clearing markers")
for _, marker in pairs(markersByClusterId) do
marker:clearObjects()
-- Also clear old markers
for _, marker in pairs(oldMarkersByClusterId) do
marker:clearObjects()
@/lua/vehicle/beamstate.lua
-- highlight all coupling nodes
for _, coupler in pairs(couplerCache) do
if not coupler.couplerLock and not coupler.couplerWeld and ((coupler.couplerTag and externalCouplerVisibilityTags[coupler.couplerTag]) or (coupler.tag and externalCouplerVisibilityTags[coupler.tag])) then
visibleTags = {}
for _, c in pairs(couplerCache) do
if not c.couplerWeld and not c.couplerLock and c.couplerTag then
local nodetag = _nodetag or ""
for _, val in pairs(couplerCache) do
if (val.couplerWeld ~= true and val.couplerTag and (_nodetag == nil or val.couplerTag == nodetag)) and val.cid then
local nodetag = _nodetag or ""
for _, val in pairs(couplerCache) do
if ((val.couplerLock ~= true or forceLocked) and (val.couplerWeld ~= true or forceWelded) and val.couplerTag and (_nodetag == nil or val.couplerTag == nodetag)) and val.cid then
-- check for manual coupler
for nid, c in pairs(couplerCache) do
if not c.couplerWeld and not c.couplerLock and c.couplerTag and (nodeTag == nil or c.couplerTag == nodeTag) then
--otherwise we'd detect the secondary one as "attached" here even if it's locked or welded
for nid, _ in pairs(attachedCouplers) do
if couplerCache[nid] and not couplerCache[nid].couplerWeld and not couplerCache[nid].couplerLock and (nodeTag == nil or couplerCache[nid].couplerTag == nodeTag) then
local isAttached = false
for cid, coupler in pairs(couplerCache) do
if coupler.couplerTag == _nodetag then
local breakGroups = type(n.breakGroup) == "table" and n.breakGroup or {n.breakGroup}
for _, g in pairs(breakGroups) do
couplerBreakGroupCache[g] = couplerBreakGroupCacheOrig[g]
local breakGroups = type(n.breakGroup) == "table" and n.breakGroup or {n.breakGroup}
for _, g in pairs(breakGroups) do
breakBreakGroup(g)
local couplerOffset = {}
for _, c in pairs(couplerCache) do
if c.couplerTag == couplerTag or c.tag == couplerTag or couplerTag == "" or not couplerTag then
if data.inputs then
for k, v in pairs(data.inputs) do
input.event(k, v, 2)
if wheel.treadNodes ~= nil and wheel.treadBeams ~= nil then
for _, nodecid in pairs(wheel.treadNodes) do
local frictionCoef = v.data.nodes[nodecid].frictionCoef
for _, beamcid in pairs(wheel.treadBeams) do
obj:setBeamSpringDamp(beamcid, v.data.beams[beamcid].beamSpring * 0.1, 2, -1, -1)
if wheel.sideBeams ~= nil then
for _, beamcid in pairs(wheel.sideBeams) do
obj:setBeamSpringDamp(beamcid, 0, 10, -1, -1)
if wheel.peripheryBeams ~= nil then
for _, beamcid in pairs(wheel.peripheryBeams) do
obj:setBeamSpringDamp(beamcid, v.data.beams[beamcid].beamSpring * 0.1, 2, -1, -1)
if wheel.reinfBeams ~= nil then
for _, beamcid in pairs(wheel.reinfBeams) do
obj:setBeamSpringDamp(beamcid, 0, 0.7, 0, 0)
if wheel.pressuredBeams ~= nil then
for _, beamcid in pairs(wheel.pressuredBeams) do
obj:setBeamPressureRel(beamcid, 0, math.huge, -1, -1)
local damageSum = 0
for k, partData in pairs(partDamageData) do
local partValue = partData.value
if autoCouplingTimer > 0.5 then
for nodeTag, _ in pairs(autoCouplingVisibleTags) do
attachCouplers(nodeTag)
-- transmit data
for _, coupler in pairs(transmitCouplers) do
if coupler.obj2id then
data.electrics = {}
for _, v in pairs(coupler.exportElectrics) do
data.electrics[v] = electrics.values[v]
data.inputs = {}
for _, v in pairs(coupler.exportInputs) do
data.inputs[v] = electrics.values[v] or input[v]
if part.parts then
for _, subSlot in pairs(part.parts) do
for _, subPart in pairs(subSlot) do
for _, subSlot in pairs(part.parts) do
for _, subPart in pairs(subSlot) do
searchForActiveParts(subPart, activeParts)
for _, beam in pairs(vehicle.beams) do
local b1, b2 = beam.id1, beam.id2
for _, tri in pairs(vehicle.triangles) do
local t1, t2, t3 = tri.id1, tri.id2, tri.id3
collTriState = {}
for _, t in pairs(v.data.triangles) do
if t.cid and t.beamCount then
local breakGroups = type(t.breakGroup) == "table" and t.breakGroup or {t.breakGroup}
for _, g in pairs(breakGroups) do
triangleBreakGroupCache[g] = triangleBreakGroupCache[g] or {}
for _, n in pairs(v.data.nodes or {}) do
if n.name then
local breakGroups = type(n.breakGroup) == "table" and n.breakGroup or {n.breakGroup}
for _, g in pairs(breakGroups) do
couplerBreakGroupCache[g] = couplerBreakGroupCache[g] or {}
for _, c in pairs(couplerCache) do
if c.couplerStartRadius and c.cid then
M.activeParts = {}
for _, slot in pairs(v.data.slotMap or {}) do
for _, part in pairs(slot) do
for _, slot in pairs(v.data.slotMap or {}) do
for _, part in pairs(slot) do
searchForActiveParts(part, M.activeParts)
if v.data.activeParts and v.data.activePartsData then
for partPath, partName in pairs(v.data.activeParts) do
local part = v.data.activePartsData[partName]
if v.data.beams then
for bid, b in pairs(v.data.beams) do
if b.tag then
local breakGroups = type(b.breakGroup) == "table" and b.breakGroup or {b.breakGroup}
for _, g in pairs(breakGroups) do
if not breakGroupCache[g] then
local deformGroups = type(b.deformGroup) == "table" and b.deformGroup or {b.deformGroup}
for _, g in pairs(deformGroups) do
local group = M.deformGroupDamage[g] or {eventCount = 0, damage = 0, maxEvents = 0, invMaxEvents = 0}
if v.data.torsionbars then
for _, t in pairs(v.data.torsionbars) do
if type(t.precompressionTime) == "number" and t.precompressionTime > 0 then
for k, v in pairs(invBodyPartBeamCount) do
invBodyPartBeamCount[k] = 1 / v
local function breakAllBreakgroups()
for _, b in pairs(v.data.beams) do
if b.breakGroup ~= nil then
--break groups that ONLY exist with couplers in them
for breakgroup, _ in pairs(couplerBreakGroupCache) do
breakBreakGroup(breakgroup)
local function breakHinges()
for _, b in pairs(v.data.beams) do
if b.breakGroup ~= nil then
-- multiple break groups
for _, g in pairs(breakGroups) do
if type(g) == "string" and (string.find(g, "hinge") ~= nil or string.find(g, "latch") ~= nil) then
--break groups that ONLY exist with couplers in them
for breakgroup, _ in pairs(couplerBreakGroupCache) do
if type(breakgroup) == "string" and (string.find(breakgroup, "hinge") ~= nil or string.find(breakgroup, "latch") ~= nil) then
local function deflateTires()
for i, _ in pairs(wheels.wheels) do
deflateTire(i)
local inflatedTires = {}
for k, v in pairs(wheels.wheels) do
if not v.isTireDeflated then
end
for _, b in pairs(v.data.beams) do
if b.deformSwitches ~= nil then
local deformSwitchesT = type(b.deformSwitches) == "table" and b.deformSwitches or {b.deformSwitches}
for _, g in pairs(deformSwitchesT) do
if g.deformGroup == group then
local data = {}
for _, beam in pairs(v.data.beams) do
local n1 = v.data.nodes[beam.id1]
local function hasCouplers(couplerTag)
for _, val in pairs(couplerCache) do
if (val.couplerWeld ~= true and val.couplerTag) and val.cid and (couplerTag == nil or val.couplerTag == couplerTag or val.tag == couplerTag) then
save.hydros = {}
for _, h in pairs(hydros.hydros) do
table.insert(save.hydros, h.state)
save.nodes = {}
for _, node in pairs(v.data.nodes) do
local d = {obj:getNodePosition(node.cid):toTable()}
save.beams = {}
for _, beam in pairs(v.data.beams) do
local d = {
for k, h in pairs(save.hydros) do
hydros.hydros[k].state = h
for cid, node in pairs(save.nodes) do
cid = tonumber(cid) - 1
for cid, beam in pairs(save.beams) do
cid = tonumber(cid) - 1
local damageData = {}
for partName, partData in pairs(partDamageData) do
local brokenCoef = clamp(partData.beamsBroken / partData.brokenBeamsThreshold, 0, 1)
@/lua/common/jbeam/materials.lua
for flexKey, flexbody in pairs(vehicle.flexbodies) do
flexmeshMats[flexbody.mesh] = vehicleObj:getMeshsMaterialsTbl(flexbody.mesh)
--if(not meshes or #meshes == 0 or (#meshes == 1 and meshes[1] == '')) then log('E', "material.init", "[glowmap] No meshes containing material " .. orgMat) end
for meshi, mesh in pairs(meshes) do
local gmat = deepcopy(gm)
elseif type(gm.simpleFunction) == "table" then
for fk, fc in pairs(gm.simpleFunction) do
local s = "(" .. fk .. "*" .. fc .. ")"
elseif gm.advancedFunction and gm.advancedFunction.triggers and gm.advancedFunction.cmd then
for _, fc in pairs(gm.advancedFunction.triggers) do
mv[fc] = 0
-- debug helper: list all materials on a mesh:
--for flexKey, flexbody in pairs(vehicle.flexbodies) do
-- log('D', "material.init", "flexbody mesh '"..flexbody.mesh.."' contains the following materials: " .. dumps(vehicleObj:getMeshsMaterialsTbl(flexbody.mesh)))
for flexKey, flexbody in pairs(vehicle.flexbodies) do
if flexbody.deformGroup and flexbody.deformGroup ~= "" then
for mati, matName in pairs(flexmeshMats[flexbody.mesh]) do
if matName == "" then
for i, b in pairs(vehicle.beams) do
if b.deformGroup then
local deformGroups = type(b.deformGroup) == "table" and b.deformGroup or {b.deformGroup}
for _, g in pairs(deformGroups) do
if switchTmp[g] ~= nil then
if switchTmp[g] ~= nil then
for sk, sv in pairs(switchTmp[g]) do
if b.deformSwitches == nil then
--log('I', "material.init", "available deformGroups:")
--for k, va in pairs(assignStats) do
-- log('I', "material.init", " * " .. k .. " on " .. va .. " beams")
triggerList = {}
for _, s in pairs(triggers) do
matSet[s.msc] = s
for tk, _ in pairs(triggerSet) do
table.insert(triggerList, tk)
for _, s in pairs(matSet) do
if s.on then
for _, va in pairs(switches) do
switchMaterial(vehicleObj, va, nil, matState)
local triggersCopy = deepcopy(triggers)
for _, t in pairs(triggersCopy) do
t.evalFunction = nil
@/lua/ge/extensions/flowgraph/nodes/ui/onBigmapPoiSelected.lua
self.pinOut.denavigated.value = false
for flag, act in pairs(self.flags) do
self.pinOut[flag].value = act
@/lua/ge/extensions/gameplay/drift/bounds.lua
for _, zone in pairs(sites.zones.objects) do
zone:drawDebug(nil, isOutOfBounds and red or white, 2, -0.5, not isOutOfBounds)
@/lua/ge/extensions/editor/iconOverview.lua
local i = 0
for k,v in pairs(icons) do
if imgui.ImGuiTextFilter_PassFilter(filter, v) then
@/lua/ge/extensions/editor/roadRiverCacheHandler.lua
for _, group in ipairs(groups) do
for _, name in pairs(group:getObjects()) do
local object = scenetree.findObject(name)
@/lua/vehicle/mapmgr.lua
buf:put('{')
for k, v in pairs(states) do
buf:putf('[%q]=%s,', k, v)
@/lua/ge/extensions/editor/gen/terrain.lua
T.out[cname] = {}
for i,p in pairs(list) do
local v = f and f(p) or p
aloop = {}
for key,_ in pairs(legend) do
T.out[key] = nil
local rdlist = editor.getAllRoads()
for roadID,_ in pairs(rdlist) do
local rd = scenetree.findObjectById(roadID)
end
for _,p in pairs(mask) do
tb:setHeightWs(p, 0)
local function corr(dw1, dw2)
for f,d in pairs(dw2) do
if not f2p[f] then f2p[f] = {list={}} end
-- frequency goes on
for _,p in pairs(f2p[f].list) do
p[2] = p[2] + 1
-- for
for f,d in pairs(f2p) do
for _,p in pairs(d.list) do
for f,d in pairs(f2p) do
for _,p in pairs(d.list) do
waveUp(f, p)
lo('>> regionPlot:'..#aregion)
for i,r in pairs(aregion) do
aregion[i] = {p=r.p, w=r.w}
-- local dmi,imi = math.huge
for k,d in pairs(aregion) do
-- pick strongest
-- toMark(ap, 'white', nil, 0.2, 0.5)
for i,list in pairs(afill) do
aregion[i].amark = {}
aregion[i].amark = {}
for _,p in pairs(list) do
aregion[i].amark[#aregion[i].amark+1] = p+vec3(0,0,forZ(p))
U.dump(ahit, '?? for_HIT:'..#ahit)
for i,d in pairs(ahit) do
lo('?? for_HIT:'..i..':'..path[d.ind].seg.ind)
end
for i,h in pairs(ahit) do
if i>1 and ahit[i-1].isclose then
-- decalUp(dec)
-- for i,p in pairs(ahit) do
end
-- project loop along dir
for i,n in pairs(loop) do
-- local p,s =
local am1 = {}
for i,d in pairs(loop) do
local pp,s = U.toLine(d.p, {a,b})
end
for i,b in pairs(junc.list) do
-- lo('?? for_BR:'..i..':'..b.ind)
if not asli2 or not asli1 then return end
for k,s in pairs(asli2) do
local L = s[1]:distance(s[2])
local dmi,dma,lmi,lma,pmi,pma = math.huge,0
for l,t in pairs(asli1) do
-- s - distance from s[1]
local function ext(asli)
for i,s in pairs(asli) do
if s.w > default.WMI_TOMERGE*D.default.laneWidth then
local dmi,kmi = math.huge
for k,h in pairs(ahit) do
local dist = h.p:distance(s.list[1])
dmi,kmi = math.huge
for k,h in pairs(ahit) do
local dist = h.p:distance(s.list[#s.list])
lo('?? for_SLI1:'..tostring(asli1 and #asli1 or nil)..':'..#loop)
for _,s in pairs(asli1) do
local desc = {list=s, w=(1+U.rand(-0.2,0.4))*D.default.laneWidth, mat='WarningMaterial', skip=true}
--[[
for _,s in pairs(asli2) do
local desc = {list=s, w=(_==1 and 1.4 or 1)*D.default.laneWidth, mat='WarningMaterial', skip=true}
ext(aslice)
for _,s in pairs(asli2) do
local desc = {list=s, w=(1+U.rand(-0.2,0.4))*D.default.laneWidth, mat='WarningMaterial', skip=true}
hasexit = false
for i,s in pairs(asli1) do
if i>1 and aslice[#aslice].w > default.WMI_TOMERGE*D.default.laneWidth then
hasexit = false
for i,s in pairs(asli2) do
if i>1 and aslice[#aslice].w > default.WMI_TOMERGE*D.default.laneWidth then
for i,desc in pairs(aslice) do
decalUp(desc)
--[[
for t,v in pairs(loop) do
lo('?? in_LOOP:'..t..':'..tostring(v.p)..':'..tostring(v.w))
T.out.inplace = true
for i,r in pairs(aregion) do
r.amark = nil
local anode = {}
for key,seg in pairs(dnode) do
for i=1,2 do
local p = vec3(0,0,0)
for _,e in pairs(seg[i]) do
p = p + e
-- build stars
for i,r in pairs(aregion) do
r.star = {} -- indexes of relevant nodes
r.star = {} -- indexes of relevant nodes
for k,n in pairs(anode) do
if #U.index(n.key,i) > 0 then
if i == 4 then
for _,k in pairs(r.star) do
lo('?? for_ang:'..k..':'..U.vang(anode[k].p-r.p, vec3(1,0),true))
local aseg = {}
for i,r in pairs(aregion) do
for k,ni in pairs(r.star) do
for i,r in pairs(aregion) do
for k,ni in pairs(r.star) do
local nito = U.mod(k+1, r.star)
-- place decals
for key,s in pairs(aseg) do
--- add segment
desc.ind = #adec
for _,ir in pairs(s.areg) do
local reg = aregion[ir]
local desc,reg
for k,s in pairs(aseg) do
reg = aregion[s.areg[1]]
local dmi,imi = math.huge
for i,p in pairs(s.list) do
local L = aregion[s.areg[1]].p:distance(p)+aregion[s.areg[2]].p:distance(p)
if reg.arad and #reg.arad > 0 then
for k,d in pairs(reg.arad) do
rmi = rmi + d.list[1]:distance(d.list[#d.list])
lo('?? pre_LOAD:'..#adec)
-- for i,d in pairs(adec) do
-- lo('?? for_DEC:'..i..':'..d.ind)
-- APPEND valency-2 junctions
for i,reg in pairs(aregion) do
local jset
local jset
for j,junc in pairs(ajunc) do
if junc.p:distance(reg.p) < 1 then
junc.list = reg.arad
for i,b in pairs(junc.list) do
if junc.p:distance(b.list[1]) < 1 then
ajunc[#ajunc+1] = {p=reg.p, list=reg.arad}
for i,b in pairs(ajunc[#ajunc].list) do
if ajunc[#ajunc].p:distance(b.list[1]) < 1 then
-- if true then return end
-- for i,c in pairs(ajunc) do
-- lo('?? for_junc:'..i..':'..tostring(c.p))
-- U.dump(across, '?? across:')
for t,reg in pairs(aregion) do
reg.amark = nil
-- lo('?? for_JUNC:'..#ajunc)
for k,c in pairs(ajunc) do
-- lo('?? if_dist:'.._..':'..tostring(c.p)..':'..tostring(reg.p))
if c.p:distance(reg.p) < U.small_dist then
for i,b in pairs(c.list) do
-- lo('?? for_SEC:'..t..':'..i)
-- toMark({junc.list[1].list[1],junc.list[1].list[#junc.list[1].list]}, 'mag', nil, 0.1, 1)
for i,b in pairs(junc.list) do
-- lo('?? for_BR:'..i..':'..b.ind)
local function trim(asli2,asli1)
for k,s in pairs(asli2) do
local L = s[1]:distance(s[2])
local dmi,dma,lmi,lma,pmi,pma = math.huge,0
for l,t in pairs(asli1) do
-- s - distance from s[1]
--[[
for i,r in pairs(aregion) do
for k,s in pairs(aseg) do
for i,r in pairs(aregion) do
for k,s in pairs(aseg) do
if #U.index(s.areg, i) > 0 then
-- render
for i,s in pairs(asli1) do
local desc = {list=s, w=(1+U.rand(-0.2,0.4))*D.default.laneWidth, mat='WarningMaterial', skip=true}
end
for i,s in pairs(asli2) do
local desc = {list=s, w=(1+U.rand(-0.2,0.4))*D.default.laneWidth, mat='WarningMaterial', skip=true}
--[[
for i,s in pairs(asli1) do
local desc = {list=s, w=1*D.default.laneWidth, mat='WarningMaterial'}
if true then return end
for i,s in pairs(asli2) do
local desc = {list=s, w=1*D.default.laneWidth, mat='WarningMaterial'}
for j=i+1,#aregion do
for _,nd in pairs(anode) do
if #U.index(nd.key,i)>0 and #U.index(nd.key,j)>0 then
-- place decals
for key,s in pairs(aseg) do
if #s == 2 then
aregion = jsonDecode(str)
for i,d in pairs(aregion) do
d.p = vec3(d.p.x,d.p.y)
ama = 0
for i,v in pairs(dw) do
if v > ama then
-- aregion = jsonDecode(str)
for i,d in pairs(aregion) do
d.p = vec3(d.p.x,d.p.y)
local loop = aloop[T.out.insector]
for i,rd in pairs(loop.aslice) do
decalDel(rd.ind)
local loop = aloop[T.out.insector]
for i,rd in pairs(loop.aslice) do
decalDel(rd.ind)
local loop = aloop[T.out.insector]
for i,rd in pairs(loop.aslice) do
decalDel(rd.ind)
local loop = aloop[T.out.insector]
for i,rd in pairs(loop.aslice) do
decalDel(rd.ind)
-- clean
for i,rd in pairs(loop.aslice) do
-- lo('?? to_del:'..rd.ind..':'..#adec) --..':'..adec[rd.ind].ind)
local torem
for i,d in pairs(aregion) do
if U.angDist(d.p) < 0.06 then
local dmi,lmi,imi,pmi = math.huge
for i,loop in pairs(aloop) do
local poly = {}
local poly = {}
for j,v in pairs(loop.list) do
poly[#poly+1] = v.p
--[[
for i,reg in pairs(aregion) do
if reg.p:distance(rayCast.pos) < 10 then
local dmi,lmi,imi,pmi = math.huge
for i,loop in pairs(aloop) do
local poly = {}
local poly = {}
for j,v in pairs(loop.list) do
poly[#poly+1] = v.p
--[[
for j,v in pairs(loop.list) do
if v.p:distance(p)
if im.IsMouseReleased(0) then
for key,val in pairs(dval) do
lo('?? for_val:'..key..':'..val)
if w ~= 0 and editor.keyModifiers.ctrl then
for i,d in pairs(aregion) do
if rayCast and d.p:distance(rayCast.pos)/core_camera.getPosition():distance(rayCast.pos) < 0.02 then
local s = 0
for j,o in pairs(aregion) do
s = s + o.w
s = s/#aregion
for j,o in pairs(aregion) do
o.w = o.w/s
--------------------
for i,d in pairs(aregion) do
if true or U._PRD == 1 then
-- lo('?? for_LKEY2:'..tostring(key)..':'..tostring(d.amark and #d.amark or nil)..':'..tostring(legend[key][2])..':'..tostring(d.amark[1]))
for _,p in pairs(d.amark) do
R.sphere(p, legend[key][2], c)
for key,d in pairs(legend) do
if T.out[key] and #T.out[key] > 0 then
-- lo('?? for_mark:'..tostring(T.out[key][1]))
for i,p in pairs(T.out[key]) do
R.sphere(p, legend[key][2], c)
@/lua/common/utils/perf.lua
local fcts = {}
for k,v in pairs(timings_tmp) do
if calls_tmp[k] > 0 then
@/lua/ge/extensions/flowgraph/nodes/scene/rectMarker.lua
self:clear()
for _, p in pairs(self.pinOut) do p.value = nil end
return
local corner, found, hit
for k,marker in pairs(self.markerObjects)do
if k == 1 then --top left
@/lua/vehicle/extensions/tech/GPS.lua
local function updateGFX(dtSim)
for sensorId, _ in pairs(GPSs) do
updateGPSGFXStep(dtSim, sensorId, false, nil)
local function onVehicleDestroyed(vid)
for sensorId, _ in pairs(GPSs) do
if vid == objectId then
@/lua/ge/extensions/flowgraph/nodes/gameplay/traffic/signals/controller.lua
for i = old, new + 1, -1 do
for _, lnk in pairs(self.graph.links) do
if lnk.sourcePin == self.pinOut['stateName_'..i] or lnk.sourcePin == self.pinOut['stateDuration_'..i] then
@/lua/ge/extensions/flowgraph/nodes/activity/activityHook.lua
local pinData = {}
for k, v in pairs(self.pinIn) do
if k ~= 'flow' and k ~= 'reset' then
@/lua/ge/extensions/editor/vehicleEditor/liveEditor/veAdjustableTechCarTuner.lua
for var, varData in pairs(varsData) do
local vdataVar = vdataVars[var]
vehData.config.vars = vehData.config.vars or {}
for var, varData in pairs(varsData) do
if varData.valPtr then
local function onEditorInitialized()
for k, view in pairs(carViews) do
view.img = imguiUtils.texObj(view.imgPath)
@/lua/ge/extensions/flowgraph/nodes/input/blacklistAction.lua
allCategories = {}
for name, info in pairs(allActions) do
allCategories[info.cat] = allCategories[info.cat] or {}
-- self.search:setSameScoreResolvingFunction(sortFun)
for name, info in pairs(allActions) do
self.search:queryElement({
self.list = {}
for k, v in pairs(listKeys) do
if v then
@/lua/vehicle/controller/vehicleController/shiftLogic/electricMotor.lua
local totalMaxBrakeTorque = 0
for _, wd in pairs(wheels.wheels) do
totalMaxBrakeTorque = totalMaxBrakeTorque + wd.brakeTorque * (wd.brakeInputSplit + (1 - wd.brakeInputSplit) * wd.brakeSplitCoef)
local totalBrakeTorque = 0
for _, wd in pairs(wheels.wheels) do
totalBrakeTorque = totalBrakeTorque + wd.brakeTorque * (min(brakeCoef, wd.brakeInputSplit) + max(brakeCoef - wd.brakeInputSplit, 0) * wd.brakeSplitCoef)
local totalRegenTorque = 0
for _, motor in pairs(motors) do
totalRegenTorque = totalRegenTorque + regenCoef * motor.maxRegenTorque * motor.cumulativeGearRatio
automaticHandling.availableModeLookup = {}
for _, v in pairs(automaticHandling.availableModes) do
automaticHandling.availableModeLookup[v] = true
@/gameplay/missionTypes/evade/customNodes/getClosestTrafficNode.lua
self.pos:setFromTable(self.pinIn.position.value)
for k, v in pairs(gameplay_traffic.getTrafficData()) do
if not role or role == v.role.name then
@/lua/ge/extensions/editor/meshSpline/import.lua
local uniqueList = {}
for path in pairs(uniquePaths) do -- Create a list of unique mesh paths.
table.insert(uniqueList, path)
local total = #mainMeshes
for path, count in pairs(uniquePaths) do
meshInfo[path] = count / total
local sortedMeshes = {}
for meshPath, freq in pairs(meshInfo) do
table.insert(sortedMeshes, { path = meshPath, freq = freq })
local missingCount = 0
for id in pairs(originalIds) do -- Count the number of missing TSStatic objects.
if not orderedIds[id] then
local extraCount = 0
for id in pairs(orderedIds) do -- Count the number of extra TSStatic objects.
if not originalIds[id] then
local meshesInPolygon = {}
for _, meshName in pairs(scenetree.findClassObjects("TSStatic")) do
local obj = scenetree.findObject(meshName)
@/lua/vehicle/powertrain/electricServo.lua
for _, nid in pairs(wheel.nodes) do
local n = v.data.nodes[nid]
@/lua/vehicle/sounds.lua
-- sound bank
for _, snd in pairs(soundBank.sounds) do
if snd.active then
--apply modifiers if applicable
for _, s in pairs(snd.volumeModifiers) do
sndVol = sndVol * getSoundModifier(s)
for _, s in pairs(snd.pitchModifiers) do
sndPitch = sndPitch * getSoundModifier(s)
for wi, wd in pairs(wheels.wheels) do
local wheelSound = wheelsSounds[wi]
local soundBank = {}
for _, sbfn in pairs(sbeamFiles) do
local tmp = readDictJSONTable(sbfn)
if tmp then
for _, v in pairs(tmp.sounds) do
v.minVolume = v.minVolume * sbeamVolumeFactor
soundBank.modifiersNamed = {}
for _, sbm in pairs(soundBank.modifiers) do
soundBank.modifiersNamed[sbm.name] = sbm
if #powertrain.engineData > 0 then
for _, v in pairs(powertrain.engineData) do
maxrpm = max(maxrpm, v.maxSoundRPM or 1)
local nodeNameIdx = {}
for _, node in pairs(v.data.nodes) do
if node.name then
--check and postprocess them
for skey, s in pairs(soundBank.sounds) do
-- set default values
for _, snd in pairs(soundBank.sounds) do
for k2, v2 in pairs(snd) do
for _, snd in pairs(soundBank.sounds) do
for k2, v2 in pairs(snd) do
if v2 == "MAXRPM" then
local soundGroup = v.data.engine and v.data.engine.soundGroup
for _, vl in pairs(soundBank.sounds) do
vl.active = (vl.group == "default" or vl.group == soundGroup)
if v.data.beams then
for _, bm in pairs(v.data.beams) do
if bm.soundFile ~= nil then
for matId, event in pairs(scrapeMap) do
if type(event) == "string" then --this can be nil (if nothing exists for a given material) or a boolean/false (if disabled via jbeam)
for wi, wd in pairs(wheels.wheels) do
addWheelSounds(wi, wd)
if soundscapes then
for name, soundscape in pairs(soundscapes) do
bdebug.setNodeDebugText("Soundscape", type(soundscape.node) == "number" and soundscape.node or M.refNode, name .. ": " .. soundscape.src)
--resend all static tire properties upon reset because the GE param cache is cleared upon vehicle reset
for wi, wh in pairs(wheelsSounds or {}) do
local wd = wheels.wheels[wi]
for wi, wh in pairs(wheelsSounds or {}) do
if wh.rigidRoll then
if soundConfig then
for name, data in pairs(soundConfig) do
local blendFileName = data.blendFile:match("^.+/(.+)$")
@/lua/ge/extensions/editor/audioEventsList.lua
for _, event in pairs(eventsList) do
local entry = {name = event.eventName, score = 1}
@/lua/ge/extensions/ui/messagesTasksAppContainers.lua
for _, app in pairs(container.apps) do
app.visible = false
local visibleApps = {}
for appId, app in pairs(container.apps) do
if app.visible then
local apps = {}
for appId, app in pairs(container.apps) do
apps[appId] = app
local data = {}
for containerId, container in pairs(appContainersById) do
data[containerId] = {}
data[containerId] = {}
for appId, app in pairs(container.apps) do
data[containerId][appId] = app.visible
for containerId, apps in pairs(data) do
for appId, visible in pairs(apps) do
for containerId, apps in pairs(data) do
for appId, visible in pairs(apps) do
setAppVisibility(containerId, appId, visible)
for containerId, container in pairs(appContainersById) do
im.Text("Container: " .. containerId)
if im.Button("Show All##" .. containerId) then
for appId, _ in pairs(container.apps) do
showApp(containerId, appId)
@/lua/ge/extensions/core/quickAccess.lua
if savedRecentActions then
for category, actions in pairs(savedRecentActions) do
recentActions[category] = {}
recentActions[category] = {}
for key, action in pairs(actions) do
local idx = tonumber(key) -- sometimes the key is a number, sometimes it's a string. stupid json
local savedDynamicSlotSettings = {}
for key, value in pairs(dynamicSlotSettings) do
savedDynamicSlotSettings[key] = {
local baseDynamicSlotSettings = {}
for key, value in pairs(dynamicSlotSettings) do
baseDynamicSlotSettings[key] = {
if savedDynamicSlotSettings then
for key, value in pairs(savedDynamicSlotSettings) do
local slot = dynamicSlotSettings[key]
for path, value in pairs(flatData) do
-- Check if path starts with any valid root
local isValidRoot = nil
for root in pairs(validRoots) do
if string.find(path, "^" .. root) then
-- Add the final value to the leaf node
for k, v in pairs(value) do
v.level = path -- Assign the full path to the leaf node
local function addTitleToTreeItems(tree)
for key, value in pairs(tree.items) do
if value.path then
if value.path then
for key2, value2 in pairs(tree.items) do
if value2["goto"] and value2["goto"] == value.path then
local sortedItems = {}
for key, value in pairs(tree.items) do
value._key = key
local newMenuTreeCopyForUI = {}
for key, value in pairs(menuTreeCopyForUI) do
if string.find(key, dynamicSlotSettingsData.pathFilter) then
end
for key, value in pairs(menuTreeCopyForUI) do
for _, action in pairs(value or {}) do
for key, value in pairs(menuTreeCopyForUI) do
for _, action in pairs(value or {}) do
action.icon = updateIcon(action.icon, action.title)
local replaced = false
for k, v in pairs(menuTree[args.level]) do
if v.uniqueID == args.uniqueID then
if vData and vData.vdata and type(vData.vdata.triggers) == 'table' then
for _, trg in pairs(vData.vdata.triggers or {}) do
local trigger = veh:getTrigger(trg.abid)
-- Check each occupied slot to see if it falls within our range
for slot, _ in pairs(occupiedSlots) do
local normalizedSlot = ((slot - 1) % maxSlotAmount) + 1
for path, items in pairs(menuTreeCopy) do
for _, e in ipairs(items) do
for path, items in pairs(menuTreeCopy) do
for i = #items, 1, -1 do
}
--for _, path in pairs(favoriteActionsPaths) do
-- protectedPaths[path] = true
-- First pass: check all levels for emptiness
for level, items in pairs(menuTreeCopy) do
if level ~= "/root/" and not protectedPaths[level] then
if hasChanges then
for level, items in pairs(menuTreeCopy) do
for i = #items, 1, -1 do
if playerVehId ~= -1 then
for k, vehicleLevel in pairs(vehicleMenuTrees[playerVehId]) do
if menuTreeCopy[k] then
::gotoButtonsStart::
for levelPath, levelInfo in pairs(menuTreeCopy) do
if countLevels(levelPath) >= 2 then
end
for level, tree in pairs(menuTreeCopy) do
local dynamicItems = {}
local function renderTree(node, path)
for key, value in pairs(node) do
local currentPath = (path and (path .. "/" .. key) or key)
-- Check if the current node is a lowest-level table and extract the title if available
for subKey, subValue in pairs(value) do
if type(subValue) == "table" then
@/lua/common/jbeam/variables.lua
local d = stack[stackidx]
for key, v in pairs(d) do
local typev = type(v)
local passed = false
for k, v in pairs(slotVars) do
if str_byte(v,1) == 36 then -- $
local vars = {}
for kv,vv in pairs(allVariables) do
if vv.type == 'range' then
local newVars = {}
for k, v in pairs(allVariables) do
if type(v) == 'table' and k ~= '$components' then
local res = {}
for k, v in pairs(tbl_readonly_src) do
-- replace key
--dump(slot.variables or {})
for sectionKey, section in pairs(source_raw) do
if sectionKey == 'components' then
if sectionKey == 'components' then
for k3, v3 in pairs(section) do
if type(v3) == 'table' then
local function setFunctionsToNil(t)
for k, v in pairs(t) do
if type(v) == "function" then
-- remove any variables that are hidden
for k, v in pairs(vehicle.variables) do
if v.hidden == true then
@/lua/vehicle/energyStorage.lua
for _, jbeamData in pairs(deepcopy(v.data.energyStorage or {})) do
tableMergeRecursive(jbeamData, v.data[jbeamData.name] or {})
for _, device in pairs(powertrain.getDevices()) do
if device.energyStorage then
end
for _, s in pairs(device.energyStorage) do
local storage = energyStorages[s]
for _, storage in pairs(energyStorages) do
table.insert(orderedStorages, storage)
local beamTriggers = {}
for _, storage in pairs(energyStorages) do
if storage.breakTriggerBeam then
for _, v in pairs(v.data.beams or {}) do
if v.name and v.name ~= "" and beamTriggers[v.name] then
local function reset()
for _, v in pairs(orderedStorages) do
if v.reset then
for _, device in pairs(powertrain.getDevices()) do
if device.energyStorage then
end
for _, s in pairs(device.energyStorage) do
local storage = energyStorages[s]
-- end
-- for name, storageData in pairs(data) do
-- if name and energyStorages[name] then
local data = {}
for _, storage in pairs(energyStorages) do
if storage.serialize then
@/lua/ge/extensions/flowgraph/nodes/career/onGarageEvent.lua
self.pinOut.beforeGarageVehicleSelected.value = false
for flag, act in pairs(self.flags) do
self.pinOut[flag].value = act
@/lua/ge/extensions/tech/partAnnotations.lua
local cfg = jsonReadFile(cfgFile)
for part, color in pairs(cfg) do
annotationKeywords[part] = ColorI(color[1], color[2], color[3], 1)
local result = nil
for keyword, color in pairs(annotationKeywords) do
if string.find(part, keyword) ~= nil then
local maxKnown = -1
for keyword, color in pairs(matches) do
local len = string.len(keyword)
@/lua/vehicle/extensions/dynoClient.lua
local rearAxis = 0.0
for k,wd in pairs(v.data.wheels) do
frontAxis = math.min( frontAxis, v.data.nodes[wd.node1].pos.y )
@/lua/ge/extensions/editor/flowgraph/overview.lua
local sortedNodeIds = {}
for id, node in pairs(graph.nodes) do
table.insert(sortedNodeIds, id)
function C:fillPassedGraphsArray()
for id, graph in pairs(self.mgr.graphs) do
-- Check if the graph passes the filter
if not self.passedGraphIds[id] and editor.getPreference("flowgraph.debug.displayNodesInOverview") then
for _, node in pairs(graph.nodes) do
if node.nodeType ~= "macro/integrated" and im.ImGuiTextFilter_PassFilter(self.filter, node.name) then
end
for id, graph in pairs(self.mgr.macros) do
-- Check if the graph passes the filter
if not self.passedGraphIds[id] and editor.getPreference("flowgraph.debug.displayNodesInOverview") then
for _, node in pairs(graph.nodes) do
if node.nodeType ~= "macro/integrated" and im.ImGuiTextFilter_PassFilter(self.filter, node.name) then
self.passedGraphIds = {}
for id, graph in pairs(self.mgr.graphs) do
if graph.parentId == nil then
end
for id, graph in pairs(self.mgr.macros) do
if graph.parentId == nil then
print("-- Graphs --")
for id, gr in pairs(self.mgr.graphs) do
gr:printStructure()
print("-- Macros --")
for id, gr in pairs(self.mgr.macros) do
gr:printStructure()
for _, macro in pairs(self.mgr.macros) do
if macro.parent == nil then
@/lua/common/libs/LuaIRC/handlers.lua
if o.track_users then
for channel, v in pairs(o.channels) do
v.users[user.nick] = nil
if o.track_users then
for channel, v in pairs(o.channels) do
local users = v.users
@/lua/common/libs/LuLPeg/lulpeg.lua
acc[#acc+1] = "{\n"
for k, v in pairs( tbl ) do
local str_indent = 1
local res = {}
for k,v in pairs(t1) do
res[k] = {v, t2[k]}
end
for k,v in pairs(t2) do
if res[k] == nil then
for i = 1, select('#', ...) do
for k,v in pairs((select(i, ...))) do
destination[k] = v
local function checkpatterns(g)
for k,v in pairs(g.aux) do
if not LL_ispattern(v) then
function add_elements(a, res)
for k in pairs(a) do res[k] = true end
return res
, (type(b) == "number") and set_new{b} or b
for el in pairs(a) do
if a[el] and not b[el] then
local list = {}
for el in pairs(s) do
t_insert(list,el)
print(offset..prefix.."Grammar")
for k, pt in pairs(pt.aux) do
local prefix = ( type(k)~="string"
if Builder.proxymt then
for k, v in pairs(LL) do
if k:match"^__" then
@/lua/ge/extensions/career/modules/tuning.lua
local total = 0
for varName, value in pairs(changedVars) do
local varData = tuningData[varName]
local shoppingCartUI = {items = {}}
for name, info in pairs(shoppingCart.items) do
table.insert(shoppingCartUI.items, {varName = info.name, level = 1, title = info.title, price = info.price, type = info.type})
table.insert(shoppingCartUI.items, {varName = info.name, level = 1, title = info.title, price = info.price, type = info.type})
for name, info in pairs(info.items or {}) do
table.insert(shoppingCartUI.items, {varName = info.name, level = 2, title = info.title, price = info.price, type = info.type})
table.insert(shoppingCartUI.items, {varName = info.name, level = 2, title = info.title, price = info.price, type = info.type})
for name, info in pairs(info.items or {}) do
table.insert(shoppingCartUI.items, {varName = info.name, level = 3, title = info.title, price = info.price, type = info.type})
local res = {}
for varName1, value1 in pairs(vars1) do
if vars2[varName1] ~= value1 then
-- fill the vehicleVarsBefore with the missing default values
for varName, varTuningData in pairs(tuningData) do
if not vehicleVarsBefore[varName] then
@/lua/ge/extensions/flowgraph/link.lua
local targetPins = {}
for _, link in pairs(self.graph.links) do
if link.sourcePin == sourcePin then
local foundName = false
for _, node in pairs(self.graph.nodes) do
for _, pin in pairs(node.pinList) do
for _, node in pairs(self.graph.nodes) do
for _, pin in pairs(node.pinList) do
if pin.quickAccess and pin.accessName == name then
sourcePin.accessName = name
for _,pin in pairs(targetPins) do
pin.quickAccess = true
@/lua/ge/extensions/core/settings/graphic.lua
local modes = o.GraphicDisplayDriver.getModes()
for _,v in pairs(modes.keys) do
if current == v then
-- log('I','','Overall quality to be applied is '..value..' : '..dumps(levelData))
for k,v in pairs(levelData) do
o[k].set(v)
local temp = {}
for index, group in pairs(overallQualityPresets) do
for key, presetValue in pairs(group) do
for index, group in pairs(overallQualityPresets) do
for key, presetValue in pairs(group) do
temp[key] = true
presetKeys = {}
for k,v in pairs(temp) do
table.insert(presetKeys, k)
local matchedGroupIndex = nil
for index, group in pairs(overallQualityPresets) do
-- log('I','',' Checking group: '..tostring(index))
for k,v in pairs(data) do
if graphicsOptions[k] and type(graphicsOptions[k].init) == 'function' then
data.GraphicFullscreen = true
for k, v in pairs(data) do
settings.setValue(k, v)
@/lua/ge/extensions/gameplay/rally/notebook/structured.lua
-- init all fields to defaults
-- for fieldName, _ in pairs(Schema.schema) do
-- self.fields[fieldName] = Schema.schema[fieldName].default
-- overwrite fields with data
for fieldName, _ in pairs(Schema.schema) do
if data[fieldName] ~= nil then
@/lua/common/graphpath.lua
local i, edgeData = 0, table.new((edgeCount or 0) * 3, 0)
for node1, links in pairs(self.graph) do
for node2, linkData in pairs(links) do
for node1, links in pairs(self.graph) do
for node2, linkData in pairs(links) do
if node1 > node2 then
-- Consider succesors of node
for adjNode, value in pairs(graph[node]) do
if value.drivability == 1 then
else -- get all scc of the map graph
for node, _ in pairs(graph) do
if nodeData[node] == nil then
local isJunctionNode = {}
for nid, n in pairs(graph) do
if tableSize(n) ~= 2 then
local graphMinor, visited = {}, {}
for nid in pairs(graph) do
if isJunctionNode[nid] then
-- if there exist an edge to another junction/end node, add it to the minor graph
for n2id in pairs(graph[nid]) do
-- check if both n1id and n2id are junction nodes and also avoid including an edge twice
if node == goal then break end
for child, data in pairs(graph[node]) do
if road[child] == nil then -- if the shortest path to child has not already been found
edgeId[1] = fNode
for child, data in pairs(graph[fNode]) do
if child ~= bNode then -- a three way turn only makes sense to include at the start of the search, not mid way
local parent = road[node]
for child, data in pairs(graph[node]) do
local edgeCost
local parent = road[node]
for child, edgeData in pairs(nodeLinks) do
local edgeCost
local linkCount = max(1, tableSize(graph[node]) - (minParent[node] and 1 or 0))
for child, edgeData in pairs(graph[node]) do
if road[child] == nil then
table.clear(tab)
for k, _ in pairs(graph[node]) do
if road[k] == nil and road1[k] == nil then tab[k] = true end
local linkCountCheck = next(gnode, linkCountGT1) or (not minParent[node] and not startMinParent and linkCountGT1) -- node has more than 2 neighboors or is start node with more than 1 neighboors (the only node without a minParent at this point is the start node)
for child, edgeData in pairs(graph[node]) do
if road[child] == nil and child ~= startMinParent then -- TODO: child ~= startMinParent -> in the case of a dead end it will not be able to turn back
local linkCountCheck = next(gnode, linkCountGT1) or (not minParent1[node] and linkCountGT1) -- node has more than 2 neighboors or is start node with more than 1 neighboors
for child, edgeData in pairs(graph[node]) do
if not prevPathSet[child] and road1[child] == nil and road[child] == nil then
if node == goal then break end
for child, data in pairs(graph[node]) do
if road[child] == nil then
if node == target then break end
for child, data in pairs(graph[node]) do
if road[child] == nil then
if node == goal then break end
for child, data in pairs(graph[node]) do
if road[child] == nil then
if posNodeDist < radius * radius then
for child, _ in pairs(graph[node]) do
if visited[child] == nil then
local childCount = 0
for child, _ in pairs(graph[node]) do
if visited[child] == nil then
for child, link in pairs(graph[prevNode]) do
local childPos = graphpos[child]
for child, link in pairs(graph[prevNode]) do
local pathVec = graphpos[child] - curPos
local edgeDirVec = (positions[parent] - nodePos):normalized()
for child, data in pairs(graph[node]) do
if road[child] == nil then
@/lua/ge/extensions/flowgraph/modules/driftModule.lua
function C:onUpdate()
for _, callbackData in pairs(self.callbacks) do
if callbackData.ttl > 0 then
@/lua/ge/extensions/gameplay/rally/loop/rallyEventLog.lua
local penalties = {}
for penaltyType, data in pairs(groupData.penaltyTypes) do
table.insert(penalties, {
@/lua/ge/extensions/career/modules/delivery/cargoCards.lua
-- build grouping data on cards
for id, card in pairs(cardsById) do
local groupTags = {}
-- build group lists (new groups might have been added)
for key, group in pairs(groupsByKey) do
group.cardIdsUnsorted = {}
-- add card ids to groups
for id, card in pairs(cardsById) do
for groupKey, _ in pairs(card.groupTags) do
for id, card in pairs(cardsById) do
for groupKey, _ in pairs(card.groupTags) do
table.insert(groupsByKey[groupKey].cardIdsUnsorted, id)
table.insert(groupsByKey[groupKey].cardIdsUnsorted, id)
for filterKey, _ in pairs(card.filterTags) do
groupsByKey[groupKey].filterTags[filterKey] = true
end
for filterKey, _ in pairs(card.filterTags) do
if not usePlayerCards then
local destinationGroups = {}
for key, group in pairs(groupsByKey) do
if key ~= "destination_noDestination" and key:startswith('destination_') then
local taskGroups = {}
for key, group in pairs(groupsByKey) do
if key:startswith('task_') then
local idx = 1
for _, card in pairs(cardsById) do
card.sortValues = {}
-- give the groups in the groupsets the sorting values.
for _, groupSet in pairs(groupSets) do
for _, group in ipairs(groupSet.groups) do
local itemCount = 0
for _, card in pairs(cardsById) do
if card.isPlayerCard and
@/lua/ge/extensions/util/configListGenerator.lua
local function doesVehiclePassFiltersList(vehicleInfo, filters)
for filterName, parameters in pairs(filters) do
local popList = {}
for model_key, pop in pairs(modelPops) do
table.insert(popList, {model_key = model_key, pop = pop})
local configData = deepcopy(core_vehicles.getConfigList())
for _, vehicleInfo in pairs(configData.configs) do
if vehicleInfo.aggregates.Type
@/lua/ge/extensions/util/renderComponentsAPI.lua
if s.tsVar then
for k, v in pairs(s) do
if k ~= 'settings' then
local function setMultiSettings(keyvars)
for key, var in pairs(keyvars or {}) do
setSetting(key, var)
@/lua/ge/extensions/editor/api/valueInspector.lua
local i = 1
for key, _ in pairs(annotationsTbl) do
annotations[i] = key
@/lua/ge/extensions/flowgraph/nodes/career/onIntroPopupCareerClosed.lua
self.pinOut.closed.value = false
for flag, act in pairs(self.flags) do
self.pinOut[flag].value = act
@/lua/ge/extensions/editor/dynamicDecals/layerTypes/linkedSet.lua
for _, child in ipairs(layer.children) do
for _, property in pairs(properties) do
if im.BeginPopup(string.format("%s_%s_AddPropertyPopup", layer.uid, guiId)) then
for cat, properties in pairs(api.properties) do
im.TextColored(editor.color.beamng.Value, cat)
@/lua/ge/extensions/editor/drivePathEditor/playback.lua
-- Disable the AI for all vehicles in the playing table.
for _, v in pairs(playing) do
v.vehicle.veh:queueLuaCommand('ai.setState({mode = "stop"})')
-- Reset the vehicles to their starting positions.
for _, d in pairs(playing) do
splineMgr.resetVehiclePose(d.spline, d.vehicle)
local function handlePlayback()
for _, d in pairs(playing) do
local isStarted = d.isStarted
@/lua/vehicle/extensions/tech/LINBus/LINBusPeak.lua
local msg = msgBuffer[i]
for _, callback in pairs(linMessageCallbacks) do
callback(msg)
M.errorCodeLookup = {}
for key, value in pairs(M.errorCodes) do
M.errorCodeLookup[value] = key
@/lua/vehicle/extensions/aeroDebug.lua
for _, wd in pairs(wheels.wheels) do
local pos1 = obj:getNodePosition(wd.node1) + obj:getPosition()
aeroData.wheelNameStrings = {}
for _, wd in pairs(wheels.wheels) do
table.insert(aeroData.wheelNameStrings, wd.name)
@/lua/ge/extensions/editor/api/gui.lua
local function hideAllWindows()
for key, val in pairs(windowsState) do
if val.visible[0] then
local function setWindowGroupVisibility(groupName, visible)
for key, val in pairs(windowsState) do
if val.groupName == groupName then
state.version = WindowsStateFileFormatVersion
for key, val in pairs(windowsState) do
-- we do this because we cant serialize ffi and C++ objects
for key, val in pairs(windowsState) do
val.isVisible = false
-- copy over the state for each window
for key, val in pairs(wstate.windowsState or {}) do
windowsState[key] = val
-- resolve the size, pos and visibility
for key, val in pairs(windowsState) do
val.visible = imgui.BoolPtr(val.isVisible or false)
local function callShowWindowHookForVisibleWindows()
for key, val in pairs(windowsState) do
if val.visible[0] then
local function defocusFocusedWindow()
for key, val in pairs(windowsState) do
if val.focused then
@/lua/ge/extensions/util/saveDynamicData.lua
local blacklistLookup = {}
for _, v in pairs(vehicleBlacklist) do
blacklistLookup[v] = true
local filteredConfigs = {}
for k, v in pairs(configs) do
if (not vehicleToTest or v.model_key == vehicleToTest) and ((not pcFileToTest or pcFileToTest == "") or v.key == pcFileToTest) and not blacklistLookup[v.model_key] then
local progressCount = 1
for _, v in pairs(filteredConfigs) do
local vehName = v.model_key
log("I", logTag, "Vehicles that are skipped:")
for _, value in pairs(vehicleBlacklist) do
log("I", logTag, value)
@/lua/ge/extensions/editor/api/core.lua
for _, v in pairs(filesAndFolders) do
local newFilename = v
for _, v in pairs(filesAndFolders) do
local newFilename = v
dirtyToolsSaveInfo = {}
for name, _ in pairs(editor.dirtyTools) do
dirtyToolsSaveInfo[name] = true
imgui.BeginChild1("Windows", imgui.ImVec2(-1, imgui.GetContentRegionAvail().y - 30), imgui.WindowFlags_ChildWindow)
for name, _ in pairs(editor.dirtyTools) do
if imgui.Checkbox(name, imgui.BoolPtr(dirtyToolsSaveInfo[name])) then
if imgui.Button("Save All") then
for k, _ in pairs(dirtyToolsSaveInfo) do
if editor.dirtyTools[k] then
if imgui.Button("Save Selected") then
for k, v in pairs(dirtyToolsSaveInfo) do
if v == true then
local function getCurrentEditModeName()
for key, val in pairs(editor.editModes) do
if val == editor.editMode then return key end
@/lua/ge/extensions/core/settings/audio.lua
local audioProviderName = TorqueScriptLua.getVar( '$pref::SFX::providerName' )
for n, p in pairs(devices) do
if n == audioProviderName then
local firstProviderName = ''
for n, d in pairs(devices) do
if n ~= 'Null' then
for n, d in pairs(providers) do
if n ~= 'Null' then
@/lua/ge/extensions/gameplay/rally/tools/rallyToolbox.lua
-- Preload items: Populates the self.items table
for id, item in pairs(self.racePathAiPath) do
kdT:preLoad(id, item.x, item.y, item.z)
-- -- Preload items: Populates the self.items table
-- for id, item in pairs(self.pacenoteWaypoints) do
-- kdT:preLoad(id, item.x, item.y, item.z)
for id, item in pairs(self.routeWaypointsIndex) do
kdT:preLoad(id, item.pos.x, item.pos.y, item.pos.z)
@/lua/ge/extensions/flowgraph/nodes/activity/missionAttemptStars.lua
local pinData = {}
for name, pin in pairs(self.pinInLocal) do
if not pin.fixed and pin.type ~= 'flow' then
@/lua/vehicle/controller/pyrotechnicCharge.lua
if eventNodeName then
for cid, node in pairs(v.data.nodes) do
if node.name == eventNodeName then
@/lua/ge/extensions/editor/tech/roadArchitect/import.lua
-- Iterate over the first children.
for _, v1 in pairs(d[2]) do
local pred, succ, geom, elev, sElev, lanes, laneOffsets = nil, nil, {}, {}, {}, {}, {}
for _, v2 in pairs(v1) do
if v2.label == 'link' then
for _, v3 in pairs(v2) do
if v3.label == 'predecessor' then
elseif v2.label == 'planView' then
for _, v3 in pairs(v2) do
local gInner = {}
if v3.label == 'geometry' then
for _, v4 in pairs(v3) do
if v4.label == 'line' then
elseif v2.label == 'elevationProfile' then
for _, v3 in pairs(v2) do
if v3.label == 'elevation' then
elseif v2.label == 'lateralProfile' then
for _, v3 in pairs(v2) do
if v3.label == 'superelevation' then
elseif v2.label == 'lanes' then
for _, v3 in pairs(v2) do
if v3.label == 'laneSection' then
local lSecData = { s = tonumber(v3.xarg.s) }
for _, v4 in pairs(v3) do
if v4.label == 'left' or v4.label == 'right' then
if v4.label == 'left' or v4.label == 'right' then
for _, v5 in pairs(v4) do
if v5.label == 'lane' then
lSecData[laneId] = { type = tonumber(lD.type), dir = lD.direction, widths = {}, heights = {} }
for _, v6 in pairs(v5) do
local lA = v6.xarg
elseif v6.label == 'link' then
for _, v7 in pairs(v6) do
if v7.label == 'predecessor' then
local jId, jType, conn = tonumber(v1.xarg.id), v1.xarg.type, {}
for _, v2 in pairs(v1) do
if v2.label == 'connection' then
local links = {}
for _, v3 in pairs(v2) do
if v3.label == 'laneLink' then
@/lua/vehicle/thrusters.lua
-- clusters
for nodeId, thruster in pairs(clusterThrust) do
local ttl = thruster[2]
activeThrusters = {}
for _, thruster in pairs(v.data.thrusters) do
if thruster.control == "auto" then
for _, thruster in pairs(activeThrusters) do
thruster.factor = thruster.factor or 1
@/lua/ge/extensions/core/vehicle/inplaceEdit.lua
for _, flexbody in pairs(vBundle.vdata.flexbodies) do
if not flexbody._blinkTimer then
--dumpz(part, 2)
for _, flexbody in pairs(part.flexbodies or {}) do
vehicle:setMeshAlpha(alpha, flexbody.mesh)
for _, slot in pairs(part.slots or {}) do
local chosenPartName = vBundle.chosenParts[slot.type]
@/lua/console/bananabench-csv.lua
for vecname, v in pairs(res.tests) do
for i, test in ipairs(v.tests) do
@/lua/ge/extensions/util/autoAnnotation.lua
key = string.lower(key)
for pattern, annotation in pairs(tab) do
pattern = string.lower(pattern)
@/lua/ge/extensions/c2/panelPlugins/tileManager.lua
if mapData and mapData.graph then
for nid, pos in pairs(mapData.positions) do
local n = mapData.graph[nid]
if n then
for lid, _ in pairs(n) do
local lPos = mapData.positions[lid]
for _, col in pairs(index) do
for _, tile in pairs(col) do
for _, col in pairs(index) do
for _, tile in pairs(col) do
tile._roadMarkingSet = nil
if n then
for lid, _ in pairs(n) do
local lPos = mapData.positions[lid]
-- Iterate over all cached tiles
for key, data in pairs(activeTileCache) do
local ctx = data.metadata.tileX
@/lua/ge/extensions/gameplay/missions/missionManager.lua
for id, v in pairs(setupData.stashedVehicles) do
if v == false and getObjectByID(id) then
for id, v in pairs(setupData.stashedVehicles) do
if v == true and getObjectByID(id) then
local claimPrice = {}
for att, amount in pairs(price) do
claimPrice[att] = {amount = amount}
@/lua/ge/extensions/editor/api/dynamicDecals/textures.lua
-- for k, v in pairs(tagsWithRefs) do
-- print(string.format("%s : %d", k, #v))
@/lua/ge/extensions/ui/gameplaySelector/tileSorting.lua
M.SORT_MODE_TO_UI = {}
for uiValue, sortMode in pairs(M.UI_TO_SORT_MODE) do
M.SORT_MODE_TO_UI[sortMode] = uiValue
@/lua/ge/extensions/career/modules/partInventory.lua
if node.chosenPartName and node.chosenPartName ~= "" then
for partId, inventoryPart in pairs(partInventory) do
if inventoryPart.containingSlot == node.path and inventoryPart.location == vehicle.id then
if node.children then
for _, childNode in pairs(node.children) do
traverseTree(childNode)
initialRemovedNode.children = {}
for partId, part in pairs(disconnectedParts) do
-- remove the part
local movedOut = {}
for partId, _ in pairs(partsBefore) do
if not partsAfter[partId] then
local result = {}
for partId, part in pairs(partInventory) do
if part.location == inventoryId then
if tree.children then
for childSlot, childInfo in pairs(tree.children) do
addPartFromTree(result, childInfo, vehicleData, availableParts, vehObj, inventoryId, partConditions)
table.clear(coreSlots)
for partId, part in pairs(partInventory) do
coreSlots[part.location] = coreSlots[part.location] or {}
if part.description.slotInfoUi then
for slotName, slotInfo in pairs(part.description.slotInfoUi) do
if slotInfo.coreSlot then
table.clear(partPathToPartIdMap)
for partId, part in pairs(partInventory) do
slotToPartIdMap[part.location] = slotToPartIdMap[part.location] or {}
local function updatePartConditionsInInventory()
for partId, part in pairs(partInventory) do
if part.location > 0 and career_modules_inventory.getVehicles()[part.location].partConditions[part.partPath] then
local vehicle = career_modules_inventory.getVehicles()[inventoryId]
for partId, _ in pairs(partsThatMoved.movedOut) do
local part = partInventory[partId]
imgui.BeginChild1("partsInVehicle", imgui.ImVec2(200, 0), imgui.WindowFlags_ChildWindow)
for partId, part in pairs(partInventory) do
if part.location == currentVehicleInventoryIdForMenu then
imgui.TableNextColumn()
for partId, part in pairs(partInventory) do
imgui.Text("" .. partId)
data.brokenVehicleInventoryIds = {}
for inventoryId, vehicle in pairs(vehicles) do
data.brokenVehicleInventoryIds[tostring(inventoryId)] = career_modules_insurance_insurance.inventoryVehNeedsRepair(inventoryId)
for partId, part in pairs(partInventory) do
if not part.mainPart then
local partInventoryCopy = deepcopy(partInventory)
for partId, part in pairs(partInventoryCopy) do
part.description = nil
for partId, part in pairs(partInventory) do
vehicleModels[part.vehicleModel] = true
-- TODO if we need this data more often, we can put it in a local table in this file
for vehicleModel, _ in pairs(vehicleModels) do
local vehicleDir = string.format("/vehicles/%s/", vehicleModel)
for partId, part in pairs(partInventory) do
local partInfosVehicleModel = jBeamPartInfos[part.vehicleModel]
-- Update older versions to use "slotType" instead of "slot"
for partId, part in pairs(partInventory) do
part.slotType = part.slot
local partsToSell = {}
for partId, part in pairs(partInventory) do
if part.location == 0 then
local partsToRemove = {}
for partId, part in pairs(partInventory) do
if part.location == inventoryId then
for partId, _ in pairs(partsToRemove) do
partInventory[partId] = nil
local function getPart(inventoryId, path)
for partId, part in pairs(partInventory) do
if part.location == inventoryId and part.containingSlot == path then
local dirtyVehiclesList = {}
for invId, _ in pairs(dirtyVehicles) do
table.insert(dirtyVehiclesList, invId)
@/lua/ge/extensions/editor/gen/decal.lua
lo('?? if_MM:'..tostring(mm[{1,2}]))
for key,v in pairs(mm) do
local akey = {key}
local rdlist = editor.getAllRoads()
for id,_ in pairs(rdlist) do
local obj = scenetree.findObjectById(id)
local list = {}
for i,n in pairs(anode) do
list[#list+1] = n.pos
local function ind4id(id)
for i,rd in pairs(adec) do
if rd.id == id then
D.undo()
for _,dec in pairs(adec) do
local ind = dec.ind
-- lo('?? pre:'..tableSize(editor.getAllRoads())..':'..#scenetree.getAllObjects())
for _,o in pairs(aobj) do
-- lo('??^^^^^^^^^^^^^^^^^^^^^ for_gl_obj:'..tostring(o))
end
for ind,_ in pairs(dupd) do
local rd = adec[ind]
-- lo('?? rem_from_ed:'..tostring(fedit)..':'..tostring(adec))
for id,_ in pairs(adec) do
local obj = scenetree.findObjectById(id)
local nc = 0
for i,row in pairs(aref) do
for j,col in pairs(row) do
for i,row in pairs(aref) do
for j,col in pairs(row) do
local agrid = {}
local agrid = {}
for _,a in pairs({-1,0,1}) do
for _,b in pairs({-1,0,1}) do
for _,a in pairs({-1,0,1}) do
for _,b in pairs({-1,0,1}) do
if i+a < 1 or i+a > gmax or j+b < 1 or j+b > gmax then
end
for rsrc,asrc in pairs(aref[i][j]) do
-- if i == 526 and j == 355 then
for n = asrc[1],asrc[2] do
for _,g in pairs(agrid) do
if g == nil or g[1] == nil or g[2] == nil or aref[g[1]] == nil then
-- if true then return end
for rtgt,atgt in pairs(aref[g[1]][g[2]]) do
-- if i == 526 and j == 355 and g[1] == 526 and g[2] == 355 then
]]
for _,l in pairs(across[rsrc][n]) do
-- if rsrc == 68 and rtgt == 192 then
if true then --and rsrc == 68 then
for ni,al in pairs(across[rsrc]) do
-- U.dump(al, '?? checking:'..ni)
-- U.dump(al, '?? checking:'..ni)
for il,l in pairs(al) do
-- U.dump(l, '?? link_check:')
end
for i,r in pairs(adec) do
for k,n in pairs(r.list) do
for i,r in pairs(adec) do
for k,n in pairs(r.list) do
adec[i].list[k].z = core_terrain.getTerrainHeight(adec[i].list[k])
--[[
for _,p in pairs(out.avedit) do
p.z = core_terrain.getTerrainHeight(p)
-- local n = 1
for roadID,_ in pairs(rdlist) do
local rd = scenetree.findObjectById(roadID)
local aw = {}
for _,n in pairs(nlist) do
anode[#anode+1] = vec3(n.pos.x,n.pos.y)
aref = {}
for ir,r in pairs(adec) do
if r.skip or #U.index(askip, r.id) > 0 then goto cont end
-- end
for k,n in pairs(r.list) do
-- nn = nn + 1
out.acyan = {}
for ind,d in pairs(out.across) do
for k,c in pairs(d) do
for ind,d in pairs(out.across) do
for k,c in pairs(d) do
local abranch = {ind}
local abr = {adec[ind]}
for i,b in pairs(c) do
abranch[#abranch+1] = b[1]
U.dump(c, '?? for_CROSS8:'..ind..':'..k)
for t,b in pairs(ajunc[#ajunc].list) do
local p = ajunc[#ajunc].p
]]
for i,b in pairs(abr) do
if ajunc[#ajunc].p:distance(b.list[1]) < 1 then
if list then
for _,desc in pairs(list) do
rdlist[desc.id] = true
end
for id,_ in pairs(rdlist) do
local obj = scenetree.findObjectById(id)
out[cname] = {}
for i,p in pairs(list) do
local v = f and f(p) or p
lo('?? D.undo:'..tableSize(adec)..'/'..#adec..':'..tableSize(mask)..':'..tostring(silent))
for ij,d in pairs(mask) do
-- U.dump(ij, '?? undo_ij:'..tostring(grid2p(ij))..':'..tostring(d[1]))
tb:updateGrid()
for i,rd in pairs(adec) do
local obj = scenetree.findObjectById(rd.id)
ilist = {}
for _,ind in pairs(apick) do
ilist[#ilist+1] = ind
aconf = deepcopy(ilist)
for _,ind in pairs(ilist) do
list[#list+1] = adec[ind]
local askip = {}
for _,dec in pairs(list) do
-- dbg = dec.ind == 142 and true or nil
local pinstep = 30 -- distance between pin points
-- for _,dec in pairs(adec) do
local ind = dec.ind
local ind = dec.ind
-- for _,ind in pairs(ilist) do
local ccross
for i,ref in pairs(bcross) do
ccross = i
local ai = {ind}
for _,b in pairs(ref) do
ai[#ai+1] = b[1]
jrad = 0
for j,b in pairs(ref) do
-- U.dump(b, '?? for_B:'..tostring(j))
end
-- for k,b in pairs(ep) do
-- abranch[#abranch+1] = {b[1],b[2]}
end
for j,b in pairs(ref) do
stamp = U.stamp({b[1],b[2]},true)
if true then
-- for j,b in pairs(abranch) do
local dir0
local pc
for k,d in pairs(aang) do
if dbg then U.dump(d, '?? for_ang:'..k) end
-- toMark(rd.apin, 'blue', nil, 0.1, 0.4)
-- for _,p in pairs(rd.apin)
-- if true then return end
-- lo('?? set:'..n)
-- for key,d in pairs(mask) do
-- U.dump(d, '?? for_mask:'..tostring(key))
U.dump(askip, '?? to_skip:')
for _,rd in pairs(list) do
if #U.index(askip, rd.ind) == 0 then
-- local ind = dec.ind
-- for _,ind in pairs(ilist) do
-- local rd = adec[ind]
-- update adjacent roads
for _,ref in pairs(bcross) do
for j,b in pairs(ref) do
for _,ref in pairs(bcross) do
for j,b in pairs(ref) do
adec[b[1]].body:setPosition(adec[b[1]].body:getPosition())
if rd.aline then
for i,l in pairs(rd.aline) do
l.body:setPosition(l.body:getPosition())
table.remove(tdec, 1)
for _,t in pairs(tdec) do
-- lo('?? for_t1:'..t)
local anode = {}
for i,c in pairs(apair) do
local ac = U.split(c,',')
local nn = 0
for ir,r in pairs(adec) do
for k,n in pairs(r) do
for ir,r in pairs(adec) do
for k,n in pairs(r) do
nn = nn + 1
local aw = {}
for _,p in pairs(desc.list) do
an[#an + 1] = {pos = p, width = desc.w}
local dmi,imi,smi = math.huge
for _,i in pairs(aind) do
local d = epos(rd.body, i, side):distance(p)
local e2d = rd.e2d
for ie,d in pairs(e2d) do
if d - dist > -U.small_dist then
-- lo('?? e_UPD:'..junc.wexit) -- tostring(junc.aexit[i].body)..':'..#anode)
for k,n in pairs(apos) do
local w = awidth[k] or rd.w
--[[
for i,d in pairs(desc.list) do
d.body = decalUp(d.desc)
end
for i,d in pairs(desc.aexit) do
if d.dirty then
lo('>> junctionUpdate:'..tostring(yes))
for i,b in pairs(jdesc.list) do
if b.dirty then
toJunc(jdesc, i)
for _,ie in pairs(b.aex) do
-- lo('?? ex_hide:'..tostring(jdesc.aexit[ie].body.hidden))
forExits(jdesc, yes)
for _,e in pairs(jdesc.aexit) do
e.dirty = false
lo('?? if_LINES:'..#edesc.aline)
for i,ldesc in pairs(edesc.aline) do
decalUp(ldesc)
for i,b in pairs(jdesc.list) do
local nodelast = b.io == 1 and b.list[#b.list] or b.list[1]
out.avedit = {}
for k,p in pairs(b.list) do
-- lo('?? for_list:'..k)
out.avedit = {}
for k,p in pairs(b.listrad) do
-- lo('?? for_list:'..k)
end
for il,d in pairs(adec[b.aexo[1]].aline) do
d.body:setField('hidden', 0, 'true')
if false then
for il,d in pairs(adec[b.aexo[1] ].aline) do
d.body:setField('hidden', 0, 'true')
end
for il,d in pairs(adec[b.aexi[1] ].aline) do
d.body:setField('hidden', 0, 'true')
end
for il,d in pairs(b.aline) do
d.body:setField('hidden', 0, 'true')
-- build exits
for _,idec in pairs(b.aexo) do
local e = adec[idec]
-- lines right
for k,l in pairs(b.aline) do
l.on = true
local aline,line,ex,rdfr,rdto,newline
for i,br in pairs(jdesc.list) do
if true then
-- local b = jdesc.list[i]
for i,b in pairs(jdesc.list) do
-- lo('??+++++++++++++ branch_upd0:'..i..':'..#b.list)
out.avedit = {}
for k,p in pairs(b.list) do
-- lo('?? for_list:'..k)
out.avedit = {}
for k,p in pairs(b.listrad) do
-- lo('?? for_list:'..k)
if #b.aexo > 0 and adec[b.aexo[1]] and adec[b.aexo[1]].aline then
for il,d in pairs(adec[b.aexo[1]].aline) do
d.body:setField('hidden', 0, 'true')
if false then
for il,d in pairs(adec[b.aexo[1] ].aline) do
d.body:setField('hidden', 0, 'true')
end
for il,d in pairs(adec[b.aexi[1] ].aline) do
d.body:setField('hidden', 0, 'true')
end
for il,d in pairs(b.aline) do
d.body:setField('hidden', 0, 'true')
-- build exits
for _,idec in pairs(b.aexo) do
lo('??******* for_EXo:'..i..':'..idec)
-- lines right
for k,l in pairs(b.aline) do
l.on = true
-- local br = jdesc.list[i]
for i,br in pairs(jdesc.list) do
if true then
end
for _,rd in pairs(jdesc.list) do
rd.body:setPosition(rd.body:getPosition())
ex.aline = line4exit(ex, bout, bin)
for k,ldesc in pairs(ex.aline) do
decalUp(ldesc)
-- local b = abr[i]
for i,b in pairs(abr) do
-- U.dump(b.djrad, '??++++++++++++++ for_rad:'..i)
else
for i,b in pairs(abr) do
local dw = U.mod(i+1, abr).w/2
ex.aline = line4exit(ex, bout, bin)
for k,ldesc in pairs(ex.aline) do
decalUp(ldesc)
end
for i,b in pairs(abr) do
local dw = U.mod(i+1, abr).w/2
pto = pto.list[#pto.list]
for j,d in pairs(amatch) do
if j~=k and j~=m and d.fr~=k and d.fr~=m then
local jifr,jito = adec[amatch[k].ind].ij,adec[amatch[m].ind].ij
for _,j in pairs(ajunc) do
for ib,b in pairs(j.list) do
for _,j in pairs(ajunc) do
for ib,b in pairs(j.list) do
if (_ ~= jifr[1] or ib ~= jifr[2]) and (_ ~= jito[1] or ib ~= jito[2]) then
match = false
for k,_ in pairs(amatch) do
if not indrag then
local dmi,imi = math.huge
for m,_ in pairs(amatch) do
local a,b = adec[amatch[k].ind],adec[amatch[m].ind]
end
for s,l in pairs(amatch) do
if l.to then
end
for k,d in pairs(amatch) do
if not d.skip and d.to and not d.match then
if false then
for k,t in pairs(atry) do
lo('?? to_plot:'..t.ifr..'>'..k)
lo('<< forPlot:'..#aplot)
for i,d in pairs(amatch) do
-- d.skip = nil
if render then
for i,d in pairs(aplot) do
D.branchMerge(adec[amatch[d.fr].ind], adec[amatch[d.to].ind])
local function ifCross(c,d)
for k,v in pairs(atry) do
while tableSize(tomatch) > 0 and n<15 do
for i,_ in pairs(tomatch) do
local bfr = d.list[i]
-- fit branch
for k,dto in pairs(ajunc) do
if k ~= ind then
if k ~= ind then
for j,bto in pairs(dto.list) do
local dist = (bto.list[#bto.list]-bfr.list[#bfr.list]):length()
end
for k,v in pairs(atry) do
tomatch[v.ifr] = nil
for k,t in pairs(atry) do
local bfr = d.list[t.ifr]
for i,bfr in pairs(d.list) do
-- atry[i] = {}
local dmi,imi = math.huge
for k,dto in pairs(ajunc) do
if k ~= ind then
if k ~= ind then
for j,bto in pairs(dto.list) do
local dist = (bto.list[#bto.list]-bfr.list[#bfr.list]):length()
U.dump(atry, '?? forPlot_ATRY:')
for k,t in pairs(atry) do
local bfr = d.list[t.ifr]
-- U.dump(ajunc, '>> junctionDown:'..tostring(ind)..':'..#ajunc)
for i,b in pairs(jdesc.list) do
-- if U._MODE == 'conf' then
-- exits
for k,e in pairs(b.aexo) do
editor.deleteRoad(adec[e].id)
--?? b.aexo.id = nil
for j,l in pairs(adec[e].aline) do
editor.deleteRoad(l.id)
-- lines
for k,e in pairs(b.aexo) do
-- editor.deleteRoad(adec[e].id)
-- lo('?? down:'..i..':'..b.id)
for k,l in pairs(b.aline) do
editor.deleteRoad(l.id)
end
for k,d in pairs(amatch) do
if d.ind == b.ind then
end
for i,b in pairs(jdesc.list) do
for k,e in pairs(b.aexi) do
for i,b in pairs(jdesc.list) do
for k,e in pairs(b.aexi) do
if adec[e].id then
be:reloadCollision()
for i,d in pairs(ajunc) do
for j,b in pairs(d.list) do
for i,d in pairs(ajunc) do
for j,b in pairs(d.list) do
local rd = b.body
-- local b = jdesc.list[i]
for i,b in pairs(jdesc.list) do
if b.dirty then
if tohide then
for ie,e in pairs(b.aexi) do
if adec[e] then
end
for ie,e in pairs(b.aexo) do
if adec[e] then
-- lo('??+++++++++++++++++++++++++++ line_hide:'..#b.aline..':'..tostring(tohide)..':'..tostring(b.aexo[1]))
-- for il,d in pairs(b.aline) do
if adec[b.aexo[1]] then
if adec[b.aexo[1]] then
for il,d in pairs(adec[b.aexo[1]].aline) do
if d.body then
-- U.dump(adec[b.aexi[1]].aline, '?? for_ae_line:'..i)
for il,d in pairs(adec[b.aexi[1]].aline) do
if d.body then
end
for il,d in pairs(b.aline) do
d.body:setField('hidden', 0, tohide)
lo('??++++++++++++++++++++++++ junctionUpdate_render_branch:'..i..':'..tostring(show))
for _,idec in pairs(b.aexo) do
-- U.dump(e, '?? ex_upd:'.._)
if e then
for k,b in pairs(ajunc[cjunc].list) do
if b.ind == e.frto[2] then
-- lines right
for k,l in pairs(b.aline) do
l.on = true
if aline then
for k,l in pairs(aline) do
-- lo('?? for_LINE:'..i..':'..k..':'..tostring(l.list and #l.list or nil))
end
for _,idec in pairs(b.aexi) do
local e = adec[idec]
local aline = line4exit(e, bout, bin)
for i,l in pairs(aline) do
nodesUpdate(e.aline[i], l.list)
--[[
for _,v in pairs(shmap) do
tb:setHeightWs(v[1], v[2])
]]
for y,row in pairs(shmap) do
for x,h in pairs(row) do
for y,row in pairs(shmap) do
for x,h in pairs(row) do
tb:setHeightWs(vec3(x,y), h)
if true then return end
for id,data in pairs(aedit) do
local anode = editor.getNodes(data.body)
local anode = editor.getNodes(data.body)
for i,n in pairs(anode) do
editor.setNodeWidth(data.body, i-1, data.w)
local function inAdec(rid)
for i,r in pairs(adec) do
if r.id == rid then
local list = {}
for i,p in pairs(pth) do
list[#list+1] = p.pos
--[[
for i,r in pairs(adec) do
if r.id == cpick then
if cdec and across[cdec] then
for n,lst in pairs(across[cdec]) do
lo('?? for_cross:'..n)
local ain = {}
for i,p in pairs(aepin) do
ain[#ain + 1] = {aeinfo[p[1]].d, p[2]}
out.apicknode = {}
for _,n in pairs(anode) do
out.apicknode[#out.apicknode + 1] = n.pos
out.apick = {t}
for _,pe in pairs(ae) do
-- out.apoint[#out.apoint+1] = pe
local pp = {}
for i,rd in pairs(adec) do
if rd.id == cpick then
U.dump(star, '?? star_post:')
for _,b in pairs(star) do
-- get neighbours
for k,f in pairs(star) do
if f.rdi == cdec then
local ipre
for i,n in pairs(n2e) do
if ie and n.e > ie then
local ipre
for i,n in pairs(n2e) do
if iel and n.e > iel then
local aflag = {}
for _,c in pairs(astem) do
local lst = ard[c[1] ].list
if not jdesc then jdesc = ajunc[cjunc] end
for _,d in pairs(jdesc.list) do
editor.deleteRoad(d.body:getID())
end
for _,d in pairs(jdesc.aexit) do
editor.deleteRoad(d.body:getID())
end
for _,d in pairs(jdesc.aline) do
editor.deleteRoad(d.body:getID())
local wma = 0
for i,rd in pairs(abr) do
if rd.w > wma then
-- prepair branches info
for i,b in pairs(abr) do
if b.list[1]:distance(ajunc[cjunc].p) < 0.5 then -- U.small_dist then
local ai = {}
for _,b in pairs(abr) do
ai[#ai+1] = abr.ind
local rma = 0
for i,b in pairs(abr) do
-- road2ter({abr[1].ind},true)
local junc = ajunc[cjunc]
for i,b in pairs(junc.list) do
road2ter({b.ind}, true)
local list = {}
for i,b in pairs(ajunc[cjunc].list) do
list[#list+1] = b.ind
be:reloadCollision()
for i,b in pairs(ajunc[cjunc].list) do
-- for j,n in pairs(b.list) do
for i,b in pairs(ajunc[cjunc].list) do
-- for j,n in pairs(b.list) do
-- editor.setNodePosition(b.body, j-1, n+vec3(0,0,10))
--[[
for i,b in pairs(ajunc[cjunc].list) do
-- editor.updateRoadVertices(b.body)
-- update lines
for j,l in pairs(b.aline) do
-- l.body:setPosition(l.body:getPosition())
jdesc.r = val
for _,d in pairs(jdesc.list) do
d.dirty = true
d.dirty = true
for k,e in pairs(d.aexo) do
if adec[e] then
--TODO: reconform
-- for _,d in pairs(jdesc.aexit) do
-- d.dirty = true
elseif key == 'exit_w' then
for _,d in pairs(jdesc.list) do
d.dirty = true
d.dirty = true
for k,e in pairs(d.aexo) do
if adec[e] then
jdesc.wexit = val
for _,d in pairs(jdesc.aexit) do
d.dirty = true
if not rd.ij then return end
for i,b in pairs(ajunc[rd.ij[1]].list) do
local cang = U.vang(b.dir, -rd.dir, true) --b.dir:dot(-rd.dir)
local dmi,pmi,imi = math.huge
for i,idec in pairs(rd.aexo) do
local e = adec[idec]
D.matchClear = function()
for i,m in pairs(amatch) do
m.skip = nil
D.inMatch = function(ind)
for i,m in pairs(amatch) do
if m.ind == ind then
lo('?? pick_TARGET:')
for i,rd in pairs(adec) do
-- if onroad and onroad ~= rd.id then
-- lo('?? onROAD:'..rd.id)
for k,n in pairs(rd.list) do
if dircar:dot(n-car.pos) > 0 and n:distance(car.pos) >= default.v2tmin then
lo('?? wrongWay:'..tostring(car.pos))
for i,p in pairs(adec[ijmi[1] ].list) do
lo('?? cdist:'..ijmi[1]..':'..car.pos:distance(p))
end
for i,p in pairs(adec[icheck].list) do
lo('?? dist_check:'..icheck..':'..car.pos:distance(p)..':'..tostring(car.pos)..':'..tostring(p))
local ami,imi = math.huge
for i,b in pairs(jdesc.list) do
if U.vang(car.vel, b.dir) < ami then
if false then
for i,rd in pairs(adec) do
if onroad and onroad ~= rd.id then
-- lo('?? onROAD:'..rd.id)
for k,n in pairs(rd.list) do
if dircar:dot(n-car.pos) > 0 and n:distance(car.pos) >= default.v2tmin then
lo('?? wrongWay:'..tostring(car.pos))
for i,p in pairs(adec[ijmi[1] ].list) do
lo('?? cdist:'..ijmi[1]..':'..car.pos:distance(p))
end
for i,p in pairs(adec[icheck].list) do
lo('?? dist_check:'..icheck..':'..car.pos:distance(p)..':'..tostring(car.pos)..':'..tostring(p))
local ama,imi = -math.huge
for i,b in pairs(ajunc[rd.ij[1] ].list) do
-- lo('?? if_nbr:'..i..':'..)
if ard then
for _,d in pairs(ard) do
local pp = U.toPoly(pt, d.list)
done = true
for i,d in pairs(list) do
-- fout:write(tostring(n..':'..i..'\n'))
U.proj2D(list[i].e[2]) + vec3(0,0,forZ(U.proj2D(list[i].e[2])))}
-- for i,d in pairs(list) do
if i > 1 then
local eb,ee = U.proj2D(rd.list[1]),U.proj2D(rd.list[#rd.list])
for _,ijs in pairs(rd.aset) do
-- lo('?? for_ijs:'..tostring(ijs))
D.undo()
for _,dec in pairs(adec) do
local ind = dec.ind
-- render links
for i,d in pairs(out.aplot) do
Render.path(d.e, color(255,255,0,155), 4)
if not im.IsWindowHovered(im.HoveredFlags_AnyWindow) and not im.IsAnyItemHovered() then
for ind,rd in pairs(adec) do
local roadID = rd.id
local roadID = rd.id
-- for roadID, _ in pairs(rdlist) do
local road = scenetree.findObjectById(roadID)
local n = anode[i]
-- for _,n in pairs(anode) do
out.anode[#out.anode + 1] = n.pos
local dmi,jmi,imi = math.huge
for k,d in pairs(ajunc) do
if d.list then
if d.list then
for i,r in pairs(d.list) do
if roadID == r.id then
cjunc = k
for i,b in pairs(d.list) do
if b.io == 1 and (b.list[2]-anode[2].pos):length() < U.small_val then
-- out.avedit = {}
for i,b in pairs(d.list) do
if b.io == 1 and (b.list[2]-anode[2].pos):length() < U.small_val then
for _,m in pairs(amatch) do
if m.ind == out.pdrag.ind then
lo('?? D.mup:'..tostring(cjunc)..':'..tostring(incontrol)..':'..tostring(cmover)..' ind:'..tostring(cdescmo)..':'..tostring(indrag)) --..':'..tostring(rayCast and rayCast.pos or nil)..':'..tostring(cdescmo and adec[cdescmo].body:getOrCreatePersistentID() or nil))
for key,val in pairs(dval) do
lo('?? for_val:'..key..':'..val)
--[[
for _,b in pairs(ajunc[cjunc].list) do
b.dirty = false
end
for _,e in pairs(ajunc[cjunc].aexit) do
e.body:setField('hidden', 0, 'false')
local dmi,jmi,nmi,ie1,ie2 = math.huge
for j,dec in pairs(adec) do
if not out.sidepick or out.sidepick.src ~= dec.id then
-- if not out.sidepick or out.sidepick.src ~= dec.ind then
for k,n in pairs(dec.list) do
if j == #adec then
-- U.dump(across[#across], '?? ADDED:'..adec[#adec].ind..':'..adec[#adec].id)
for _,d in pairs(adec) do
if d.id == id then
local dmi,imi = math.huge
for i,d in pairs(ajunc) do
if rayCast and rayCast.pos:distance(d.p) < 3 then
out.agreen = {}
for _,ind in pairs(apick) do
-- lo('?? ind:'..tostring(ind))
lo('?? to_MERGE:'..#out.aplot)
for _,d in pairs(out.aplot) do
-- U.dump(d, '?? merging:'.._)
local dmi,imi = math.huge
for i,d in pairs(ajunc) do
if rayCast.pos:distance(d.p) < 3 then
local anode = editor.getNodes(croad)
for i,n in pairs(anode) do
if rayCastHit and (rayCastHit - n.pos):length() < 1 then
out.agreen = {}
for _,ind in pairs(apick) do
-- lo('?? ind:'..tostring(ind))
-- merge roads via extend
for i,rd in pairs(adec) do
if rd.id == cpick then
-- U.dump(star, '?? star_got:'..i)
for _,f in pairs(star) do
if f.rdi == i then
local ami,fmi = math.huge
for _,f in pairs(star) do
if f.rdi ~= us.rdi then
-- for k,lnk in pairs(across[fmi.rdi][])
local abranch,irem = {}
for k,lnk in pairs(across[cdec][ndi]) do
lo('?? to_check:'..k..':'..lnk[1])
--- from theirs
for _,rdi in pairs(abranch) do
-- U.dump(across[rdi], '?? to_up:'..rdi)
-- U.dump(across[rdi], '?? to_up:'..rdi)
for n,alnk in pairs(across[rdi]) do
for k,lnk in pairs(alnk) do
for n,alnk in pairs(across[rdi]) do
for k,lnk in pairs(alnk) do
if lnk[1] == cdec then
end
for n,alnk in pairs(across[fmi.rdi]) do
for k,lnk in pairs(alnk) do
for n,alnk in pairs(across[fmi.rdi]) do
for k,lnk in pairs(alnk) do
if lnk[1] == cdec then
if across[cdec] then
for n,lst in pairs(across[cdec]) do
lo('?? for_cross:'..n)
-- lo('?? key_R1:'..anode[1].width..':'..croad:getNodeWidth(1))
for i,_ in pairs((tableSize(anodesel) > 0) and anodesel or anode) do
-- lo('?? to_w:'..i)
local anode = editor.getNodes(croad)
for i,_ in pairs((tableSize(anodesel) > 0) and anodesel or anode) do
-- for i,n in pairs(anode) do
for i,_ in pairs((tableSize(anodesel) > 0) and anodesel or anode) do
-- for i,n in pairs(anode) do
editor.setNodeWidth(croad, i-1, croad:getNodeWidth(i-1) - 1)
-- MARKING
for key,l in pairs(legend) do
if out[key] then
c.alpha = legend[key][3]
for i,p in pairs(out[key]) do
sphere(p, legend[key][2], c)
-- render links
for i,d in pairs(out.aplot) do
Render.path(d.e, color(255,255,0,155), 4)
if out.aseg then
for i,e in pairs(out.aseg) do
-- U.dump(e, '?? for_eg:'..#out.aseg)
if out.acirc then
for _,d in pairs(out.acirc) do
R.circle(d.p, d.r, color(255,255,0,255), 4)
if out.atri then
for _,t in pairs(out.atri) do
debugDrawer:drawTriSolid(t[1],t[2],t[3],color(255,255,220,200))
if out.ared ~= nil then
for _,p in pairs(out.ared) do
sphere(p, 2*rbase, ColorF(1,0,0,0.4))
if out.agreen ~= nil then
for _,p in pairs(out.agreen) do
sphere(p, 2*rbase, ColorF(0,1,0,0.4))
if out.acyan ~= nil then
for _,p in pairs(out.acyan) do
sphere(p, rbase, ColorF(0,1,1,0.4))
if out.anode ~= nil then
for _,p in pairs(out.anode) do
local r = 0.1*math.sqrt((p-core_camera.getPosition()):length())
if out.apicknode ~= nil then
for i,p in pairs(out.apicknode) do
local r = 0.1*math.sqrt((p-core_camera.getPosition()):length())
-- _dbdrag = true
for _,s in pairs(out.avedit) do
if s and s.x then
if #anodesel > 0 then
for i,_ in pairs(anodesel) do
editor.setNodeWidth(croad, i-1, croad:getNodeWidth(i-1) + 1)
else
for i,n in pairs(anode) do
if true or i < 3 then
@/lua/ge/extensions/tech/pythonExport.lua
local pythonData = LuaToPython[sensorType](sensor, vehicle)
for _, kv in pairs(PythonDefaults[sensorType]) do
local property, defaultValue = next(kv, nil)
buffer:put("', beamng")
for _, kv in pairs(nonDefaultData) do
local length = #buffer - lineStart
@/lua/ge/extensions/editor/dynamicDecals/brushes.lua
local function saveBrushesToFile()
for _, brush in pairs(brushes) do
if brush["dirty"] then
@/lua/ge/extensions/util/vehicleRopeDebug.lua
for ropeId, _ in pairs(perfStats.ropeSimTimes) do
if not activeRopeIds[ropeId] then
@/lua/vehicle/controller/gauges/genericGauges.lua
electricsConfig = {}
for _, v in pairs(config) do
table.insert(electricsConfig, v)
local mergedConfig = {}
for _, v in pairs(tableFromHeaderTable(config)) do
mergedConfig[v.deviceName] = mergedConfig[v.deviceName] or {}
powertrainConfig = {}
for k, v in pairs(mergedConfig) do
local device = powertrain.getDevice(k)
local mergedConfig = {}
for _, v in pairs(tableFromHeaderTable(config)) do
mergedConfig[v.moduleName] = mergedConfig[v.moduleName] or {}
local controllerPath = "gauges/customModules/"
for k, v in pairs(mergedConfig) do
local c = controller.getController(controllerPath .. k)
--dump(configData)
for k, v in pairs(jbeamData) do
if k:sub(1, #"configuration_") == "configuration_" then
@/lua/ge/extensions/gameplay/rally/util.lua
-- function printFields(obj)
-- for k, v in pairs(obj) do
-- -- if type(v) == "function" then
@/lua/ge/extensions/career/modules/milestones/generalMilestones/branches.lua
M.onGeneralMilestonesSetupCallbacks = function()
for attKey, milestone in pairs(attKeyToMilestone) do
M.setNotificationTarget(attKey)
local function onPlayerAttributesChanged(change)
for attKey, val in pairs(change) do
if val > 0 then
@/lua/vehicle/extensions/chassisData.lua
local wheelCount = 0
for _, wheel in pairs(wheels.wheels) do
local wheelNodePos = vec3(v.data.nodes[wheel.node1].pos) --find the wheel position
for _, wheel in pairs(wheels.wheels) do
local wheelNodePos = vec3(v.data.nodes[wheel.node1].pos) --find the wheel position
local RL2 = 0
for _, n in pairs(v.data.nodes) do
if n.cid == frontRightWheel.node1 then
@/lua/ge/extensions/career/modules/delivery/parcelMods.lua
local definitions = {}
for key, _ in pairs(modKeys) do
if modifiers[key] and modifiers[key].unlockFlag then
local status = {}
for modKey, info in pairs(modifiers) do
status[modKey] = isParcelModUnlocked(modKey)
local modsByTier = {}
for modKey, info in pairs(modifiers) do
local tier = 1
end
for tier, list in pairs(modsByTier) do
table.sort(list)
@/lua/ge/extensions/gameplay/traffic/vehicle.lua
function C:checkCollisions() -- checks for contact with other tracked vehicles
for id, veh in pairs(map.objects) do
if self.id ~= id then
for otherId, otherVeh in pairs(gameplay_traffic.getTrafficData()) do -- notify other traffic vehicles of collision
if not otherVeh.otherCollisionFlag and otherId ~= self.id and otherId ~= id then
for id, coll in pairs(self.collisions) do
local veh = gameplay_traffic.getTrafficData()[id]
for id, veh in pairs(gameplay_traffic.getTrafficData()) do
if id ~= self.id then
for id, _ in pairs(self.collisions) do
self:trackCollision(id, dtSim)
-- queued functions
for k, v in pairs(self.queuedFuncs) do
if not v.timer then v.timer = 0 end
@/lua/ge/extensions/editor/flowgraphEditor.lua
for id,graph in pairs(mgr.graphs) do
if graph.type == "graph" or not graph.macroPath then
end
for id,macro in pairs(mgr.macros) do
if not macro.macroPath then
im.Text('The unsaved macros are the following: ')
for id,_ in pairs(dirtyChildren) do
im.Text(mgr.macros[id].name)
local originalFileNames = {}
for fo, elem in pairs(filesByOriginal) do
table.insert(originalFileNames, fo)
im.PopStyleVar()
for _, win in pairs(windows) do
win:draw(dtReal,dtSim,dtRaw)
local stateIds = {}
for id, state in pairs(mgr.states.states) do
if state.active then
if mgr.selectedLinkCount == 1 then
for lId, _ in pairs(mgr.selectedLinks) do
local link = mgr.graph.links[lId]
local onCount, offCount = 0,0
for lId, _ in pairs(mgr.selectedLinks) do
local link = mgr.graph.links[lId]
end
for lId, _ in pairs(mgr.selectedLinks) do
local link = mgr.graph.links[lId]
if mgr.selectedLinkCount == 0 then
for _, link in pairs(mgr.graph.links) do
if mgr.selectedNodes[link.targetNode.id] or mgr.selectedNodes[link.sourceNode.id] then
if mgr.selectedNodeCount == 0 and mgr.selectedLinkCount == 1 then
for lId, _ in pairs(mgr.selectedLinks) do
local link = mgr.graph.links[lId]
local connectedIds = {}
for nId, _ in pairs(mgr.selectedNodes) do
local node = mgr.graph.nodes[nId]
if mgr.selectedNodeCount == 2 then
for nId, _ in pairs(mgr.selectedNodes) do
local node = mgr.graph.nodes[nId]
local availableA, availableB = {},{}
for _, pin in pairs(nodeA.pinOut) do
if not pin.hidden then
end
for _, pin in pairs(nodeB.pinInLocal) do
if not pin.hidden and not pin:getFirstConnectedLink() and pin.pinMode ~= "hardcoded" then
if mgr.selectedNodeCount == 0 then
for lId, _ in pairs(mgr.selectedLinks) do
local link = mgr.graph.links[lId]
else
for _, link in pairs(mgr.graph.links) do
if mgr.selectedNodes[link.targetNode.id] and not mgr.selectedNodes[link.sourceNode.id]
if #linksToRemove == 0 then
for _, link in pairs(mgr.graph.links) do
if mgr.selectedNodes[link.targetNode.id] and mgr.selectedNodes[link.sourceNode.id] then
@/lua/ge/extensions/flowgraph/nodes/string/format.lua
for i = old, new+1, -1 do
for _, lnk in pairs(self.graph.links) do
if lnk.sourcePin == self.pinInLocal['value_'..i] then
@/lua/vehicle/controller/tech/idealRADARSensor.lua
local keys = {}
for key in pairs(tbl) do
table.insert(keys, key)
local vehicles, ctr = {}, 1
for k, _ in pairs(mapmgr.getObjects()) do
if k ~= objectId then
@/lua/common/jbeam/sections/licenseplatesSkins.lua
for partName, part in pairs(activePartsData or {}) do
if part.slotType then
@/lua/vehicle/controller/drivingDynamics/actuators/adaptiveDampers.lua
dampBeams = {}
for _, b in pairs(v.data.beams) do
if b.name then
if b.name then
for _, name in pairs(dampBeamNames) do
if b.name == name then
beamModes = {}
for _, mode in pairs(modeData) do
beamModes[mode.name] = {
@/lua/ge/extensions/editor/createObjectTool.lua
if actionData.onBuildFuncFields then
for _, val in pairs(actionData.onBuildFuncFields) do
obj:setField(val[1], val[2], val[3])
if fieldsSetOnBuildFunc[currentCreateObjectItem.classname] then
for _, val in pairs(fieldsSetOnBuildFunc[currentCreateObjectItem.classname]) do
-- If this field has been set in buildFunc, serialize it.
@/lua/ge/extensions/util/screenshotCreator.lua
local count = 0
for k, v in pairs(vehList) do
if v[2][0] then
local modelKeys={}
for k,_ in pairs(models) do table.insert(modelKeys,k) end
table.sort(modelKeys)
-- Add the selection
for k, v in pairs(vehList) do
if v[2][0] then
if workOptions.selection == "selectedModels" then -- take thumbnails of the selected models
for _, modelName in pairs(listOfSelectedModels) do
for _, configData in pairs(core_vehicles.getModel(modelName).configs) do
for _, modelName in pairs(listOfSelectedModels) do
for _, configData in pairs(core_vehicles.getModel(modelName).configs) do
if forceQuit then
local isCurrent
for _, configData in pairs(core_vehicles.getModel(currModelName).configs) do
isCurrent = configData.key == currConfigName
@/lua/ge/extensions/gameplay/traffic.lua
local activeCount = 0
for id, veh in pairs(traffic) do
if veh.isAi and be:getObjectActive(id) then
local function refreshVehicles() -- resets core traffic vehicle data
for _, veh in pairs(traffic) do
veh:onRefresh()
for k, v in pairs(data) do
if k == 'aiMode' or k == 'aiDebug' or k == 'aiAware' then
updateTrafficPool()
for id, veh in pairs(traffic) do
veh._teleport = true
local outboundCount = 0
for id, veh in pairs(traffic) do
if veh.state == 'active' then
tempVec.z = tempVec.z - 1
for id, veh in pairs(traffic) do
if be:getObjectActive(id) then
local trafficData = {}
for _, veh in pairs(traffic) do
table.insert(trafficData, veh:onSerialize())
if data.state == 'on' then
for _, veh in pairs(data.traffic) do
insertTraffic(veh.id, not veh.isAi)
@/lua/ge/extensions/editor/api/object.lua
local objs = scenetree.getAllObjects()
for _, objName in pairs(objs) do
local obj = scenetree.findObject(objName)
local fieldData = {}
for fieldName, data in pairs(fields) do
fieldData[data.id] = data
for i = 0, data.elementCount - 1 do
for arrayFieldName, arrayField in pairs(data.fields) do
local value = editor.getFieldValue(objectID, arrayFieldName, i)
if fields.fields then
for fieldName, value in pairs(fields.fields) do
editor.setFieldValue(targetObjectID, fieldName, value)
if fields.dynamicFields then
for fieldName, value in pairs(fields.dynamicFields) do
editor.setDynamicFieldValue(targetObjectID, fieldName, value)
if fields.fields then
for fieldName, value in pairs(fields.fields) do
targetObject:setField(fieldName, 0, value)
if fields.dynamicFields then
for fieldName, value in pairs(fields.dynamicFields) do
targetObject:setDynDataFieldbyName(fieldName, 0, value)
local newSelection = {}
for _, objName in pairs(objects) do
if string.find(objName, nameMask) then
local newSelection = {}
for _, objName in pairs(objects) do
--TODO: cant we get the object refs and not the names? faster
@/lua/ge/extensions/ui/uiNavi.lua
if info.spawnPoints then
for _, point in pairs(info.spawnPoints) do
spawnPointAdditionalInfo[point.objectname] = point
for _, pid in pairs(spawnpoints) do
local o = scenetree.findObject(pid)
local poios = poi_set:getObjects() or {}
for _, pid in pairs(poios) do
local o = scenetree.findObject(pid)
for _, pid in pairs(stops) do
local o = scenetree.findObject(pid)
local foundCoresponding = {}
for id, vec in pairs(interm) do
for id2, vec2 in pairs(interm) do
for id, vec in pairs(interm) do
for id2, vec2 in pairs(interm) do
if id < id2 and vec:distance(vec2) < 70 then
-- for id, vec in pairs(interm) do
-- table.insert(res, {pos = vec:toTable()})
for k, v in pairs(map.getTrackedObjects() or {}) do
if v.uiState ~= 0 then
-- we are just renaming the nodes and references inside the links here since we don't care about the names anyway
for k, _ in pairs(tmpmap.nodes) do
nameMap[k] = counter
for k, v in pairs(tmpmap.nodes) do
newNodes[nameMap[k]] = {
newNodes[nameMap[k]].to = {}
for j, w in pairs(v.links) do
table.insert(newNodes[nameMap[k]].to, {nameMap[j], w.drivability, w.oneWay})
for k, v in pairs(tmpmap.nodes) do
if not v.hiddenInNavi then
newNodes[k].links = {}
for j, w in pairs(v.links) do
if not w.hiddenInNavi then
@/lua/ge/extensions/core/input/actionFilter.lua
clearCFilter(filter)
for actionGroupName, filtered in pairs(blockedActionGroups[filter]) do
if filtered then
local function isActionBlocked(actionName)
for filter, actions in pairs(blockedActions) do
if actions[actionName] then
@/lua/ge/extensions/career/modules/linearTutorial.lua
if saveData.linearStep == -1 then
for key, _ in pairs(saveData.flags) do
saveData.flags[key] = true
for k, v in pairs(gameplay_traffic.getTrafficData()) do
if v.role.name == "police" then
for k, v in pairs(gameplay_traffic.getTrafficData()) do
if v.role.name == "police" then
for key, values in pairs(introPopupTable) do
M[key] = function()
M.showNonTutorialWelcomeSplashscreen()
for key, values in pairs(introPopupTable) do
M[key]()
@/gameplay/tutorials/customNodes/registerTestCarsNode.lua
self.mgr._fgTutoTestCarsStep.getCarBySortedId = function(id)
for _,car in pairs(self.mgr._fgTutoTestCarsStep.carsData) do
if car.id == id then return car end
@/lua/vehicle/controller/gauges/customModules/combustionEngineData.lua
engines = powertrain.getDevicesByType("combustionEngine")
for _, v in pairs(engines) do
for _, j in pairs(v.registeredEnergyStorages) do
for _, v in pairs(engines) do
for _, j in pairs(v.registeredEnergyStorages) do
table.insert(fuelTanks, j)
@/lua/vehicle/extensions/gameplayInterface.lua
local function registerModule(name, actions, lookups)
for k, _ in pairs(actions) do
if registeredActions[k] then
end
for k, _ in pairs(lookups) do
if registeredLookups[k] then
@/lua/ge/extensions/scenario/quickRaceLoader.lua
-- filter paths to only return filename without extension
for k,v in pairs(files) do
files[k] = string.gsub(files[k], "(.*/)(.*)/(.*)", "%2")
else
for _,v in pairs(newLevel.vehicles) do
if (v.playerUsable == true or v.playerUsable == '1') or (v.driver and v.driver.player == true) then
local newPreviews = {}
for _, img in pairs(levelInfo.levelInfo.previews) do
table.insert(newPreviews, levelInfo.directory..'/' .. img)
local tmp = FS:findFiles("/levels/"..levelName.."/",levelName..'_preview*.png', 0, true, false)
for _, p in pairs(tmp) do
table.insert(levelInfo.previews, p)
tmp = FS:findFiles("/levels/"..levelName.."/",levelName..'_preview*.jpg', 0, true, false)
for _, p in pairs(tmp) do
table.insert(levelInfo.previews, p)
file.previews = {}
for _, p in pairs(tmp) do
table.insert(file.previews, p)
file.reversePreviews = {}
for _, p in pairs(tmp) do
table.insert(file.reversePreviews, p)
-- add automatic prefabs only if they exist
for list, suf in pairs(autoPrefabs) do
for _, ext in ipairs(prefabExt) do
@/lua/vehicle/powertrain/manualGearbox.lua
}
for gearIndex, _ in pairs(device.gearRatios) do
integrityState.synchroWear[gearIndex] = 0
for k, v in pairs(device.initialGearRatios) do
device.gearRatios[k] = v
local reverseGears = {}
for _, v in pairs(jbeamData.gearRatios) do
table.insert(v >= 0 and forwardGears or reverseGears, v)
local gearIndex = device.minGearIndex
for _, v in pairs(gearWhineCoefsOutput) do
device.gearWhineCoefsOutput[gearIndex] = v
local gearIndex = device.minGearIndex
for _, v in pairs(gearWhineCoefsInput) do
device.gearWhineCoefsInput[gearIndex] = v
local synchroSettingLookup = {}
for _, settings in pairs(synchroSettings) do
if settings.gearIndex then
device.synchroWearCoef = {}
for i, _ in pairs(device.gearRatios) do
local gearSettings = synchroSettingLookup[i] or {}
if not jbeamData.synchronizerSettings then
for i, _ in pairs(device.gearRatios) do
if i >= 0 then
@/lua/vehicle/controller/braking/brakedDifferentialSteering.lua
local brakeLName = jbeamData.leftBrakeName or "brake_L"
for _, wd in pairs(wheels.wheelRotators) do
if wd.name == brakeLName then
@/lua/ge/extensions/ui/gameplaySelector/tiles.lua
local validItems = {}
for _, item in pairs(items) do
if backend.passesFilters(item) then
-- Group items by the specified group mode (similar to vehicle selector approach)
for _, item in pairs(validItems) do
-- Get groups for this item (including special groups)
-- Create groups and add items
for _, groupInfo in pairs(groupsForItem) do
local groupName = groupInfo.groupName
-- Process each group to create tiles
for _, group in pairs(groups) do
local tiles = group.tiles
for clusterKey, clusterData in pairs(clusteredItems) do
-- Skip clustering for "None" results (e.g., campaign system in automatic mode)
-- For "None" clustering, add items directly without clustering
for _, item in pairs(clusterData.itemsByKey) do
table.insert(tiles, item)
if displayData.showFavouritesMode == 'completeClusters' or displayData.showRecentMode == 'completeClusters' then
for _, group in pairs(groups) do
if not group.isFavouriteGroup and not group.isRecentGroup then
if not group.isFavouriteGroup and not group.isRecentGroup then
for _, tile in pairs(group.tiles) do
-- Duplicate tiles for favourites group if needed
local favouriteTile = {}
for k, v in pairs(tile) do
favouriteTile[k] = v
local recentTile = {}
for k, v in pairs(tile) do
recentTile[k] = v
-- Sort tiles within each group
for _, group in pairs(groups) do
if group.isRecentGroup then
if group.isRecentGroup then
for _, tile in pairs(group.tiles) do
tile.recentIdx = backend.isRecent(tile.key) or math.huge
local groupsList = {}
for _, group in pairs(groups) do
if #group.tiles > 0 then
-- Filter items based on the automatic clustering rules
for _, item in pairs(items) do
-- Apply general filters first
local hasDefaultTile = false
for _, tile in pairs(filteredItems) do
tile.isDefaultSelected = false
local items = data.items
for _, item in pairs(items) do
item.showFavouriteIconPercent = backend.isFavourite(item.key) and 1 or 0
validItems = {}
for _, item in pairs(items) do
if item.validBackends[backend.backendName] then
@/lua/ge/extensions/gameplay/drift/drift.lua
-- Reset debug histories
for _, historyData in pairs(debugHistories) do
historyData.data = {}
random = getBlueNoise1d(random)
for _, scannerData in pairs(scanners) do
-- remove oldest data
for _, historyData in pairs(debugHistories) do
if historyData.data and historyData.data[maxHistorySize] then
im.BeginChild1("Debug Graph", im.ImVec2(im.GetContentRegionAvailWidth(), 400), true)
for _, historyData in pairs(debugHistories) do
im.PushStyleColor2(im.Col_Text, im.ImVec4(historyData.color[1], historyData.color[2], historyData.color[3], historyData.color[4]))
local i = 1
for _, historyData in pairs(debugHistories) do
chartData[i] = {}
@/lua/ge/extensions/flowgraph/nodes/gameplay/removeOtherVehicles.lua
for i = old, new+1, -1 do
for _, lnk in pairs(self.graph.links) do
if lnk.targetPin == self.pinInLocal[pinName..i] then
@/gameplay/missionTypes/timeTrial/constructor.lua
local vehiclesUsedPerStar = saveData.vehiclesUsedPerStar or {}
for star, achieved in pairs(attempt.unlockedStars or {}) do
if achieved then
@/gameplay/tutorials/customNodes/blacklistedCarsNode.lua
function C:work()
for id,car in pairs(self.mgr._fgTutoTestCarsStep.carsData) do
self.pinOut["car"..tostring(car.id).."Blacklisted"].value = car.blacklisted
@/lua/ge/extensions/gameplay/traffic/roles/standard.lua
for k, v in pairs(self.baseActions) do
self.actions[k] = v
@/lua/ge/extensions/scenario/quickRace.lua
fg = core_flowgraphManager.loadManager(sc.track.flowgraph.file)
for name, value in pairs(sc.track.flowgraph.variables or {}) do
fg.variables:changeBase(name, value)
if sc.generatedNodes then
for k, v in pairs(sc.generatedNodes) do
sc.nodes[k] = v
if sc.track.reverse then
for _, node in pairs(sc.nodes) do
if node.rot ~= nil then
@/lua/ge/extensions/career/modules/loanerVehicles.lua
}
for id, offer in pairs(markedForSpawningLoaners) do
-- spawn vehicle and trigger initialization
local result = {}
for inventoryId, vehInfo in pairs(career_modules_inventory.getVehicles()) do
if vehInfo.owningOrganization then
local function onUpdate(dtReal, dtSim, dtRaw)
for inventoryId, vehId in pairs(career_modules_inventory.getMapInventoryIdToVehId()) do
local vehInfo = career_modules_inventory.getVehicles()[inventoryId]
for inventoryId, loanedVehInfo in pairs(loanedVehiclesInfo) do
local vehInfo = career_modules_inventory.getVehicles()[inventoryId]
local counter = 0
for inventoryId, vehicleInfo in pairs(career_modules_inventory.getVehicles()) do
if vehicleInfo.owningOrganization == organizationId then
local numberNonTrailers, numberTrailers = 0, 0
for id, offer in pairs(markedForSpawningLoaners) do
local configInfo = core_vehicles.getConfig(offer.model, offer.config)
@/lua/ge/extensions/flowgraph/nodes/career/careerVehicleSelect.lua
function C:_executionStarted()
for _, p in pairs(self.pinOut) do
p.value = false
function C:_executionStarted()
for _, p in pairs(self.pinOut) do
p.value = false
function C:buttonPushed(action)
for nm, pn in pairs(self.pinOut) do
self.pinOut[nm].value = nm == action
self:reset()
for _,pn in pairs(self.pinOut) do
pn.value = false
@/lua/ge/extensions/core/flowgraphManager.lua
local uniqueName = ""
for nm, m in pairs(uniqueManagers) do
if mgr.id == m.id then uniqueName = nm end
end
for name,u in pairs(uniqueManagers) do
local index = -1
@/lua/ge/extensions/gameplay/drag/times.lua
if not dragData or not dragData.racers then return end
for _, racer in pairs(dragData.racers) do
racer.timersStarted = false
racer.timersStarted = false
for timerId,t in pairs(racer.timers) do
if t.type ~= "dialTimer" then
if not dragData or not dragData.racers or dragData.isCompleted then return end
for _, racer in pairs(dragData.racers) do
if not racer.timersStarted then goto continue end
for timerName, timer in pairs(timers) do
if addFrameHistoryDebug[timerName] and not timer.isSet and timer.type == "distanceTimer" then
timer.frameHistory[#timer.frameHistory+1] = string.format("Racer: %d Went over threshold at %0.5fs (%d%% of this frames duration plus the previous frames) (so between frame %d and %d)", racer.vehId, timer.value, t*100, #timer.frameHistory-1, #timer.frameHistory)
-- for _, frame in pairs(timer.frameHistory) do
-- end
@/lua/ge/extensions/flowgraph/nodes/logic/and.lua
for i = old, new+1, -1 do
for _, lnk in pairs(self.graph.links) do
if lnk.targetPin == self.pinInLocal['flow'..'_'..i] then
@/lua/ge/extensions/flowgraph/nodes/activity/aggregateAttempt.lua
local hasDefaultUnlockedStar = false
for starKey, _ in pairs(attempt.unlockedStars) do
if self.mgr.activity.careerSetup._activeStarCache.defaultStarKeysByKey[starKey] then
self.pinOut.change.value = totalChange or {}
for key, val in pairs(aggregateChange) do
if self.pinOut[key] then
@/lua/ge/extensions/editor/raceEditor/tools.lua
local function setFieldsRedo(data)
for idx, _ in pairs(data.newDataMap) do
data.self.path.pathnodes.objects[idx][data.field] = data.newDataMap[idx]
local oldDataMap = {}
for idx, _ in pairs(newDataMap) do
oldDataMap[idx] = self.path.pathnodes.objects[idx][field]
local allTransforms = {}
for _, pn in pairs(self.path.pathnodes.objects) do
local transforms = pn:getSideTransforms(self:getSideTransformParameters())
local newDataMap = {}
for _, node in pairs(self.path.pathnodes.objects) do
newDataMap[node.id] = core_terrain.getTerrainHeight(node.pos)
local newDataMap = {}
for _, node in pairs(self.path.pathnodes.objects) do
if node.hasNormal then
local newDataMap = {}
for _, node in pairs(self.path.pathnodes.objects) do
newDataMap[node.id] = nodeSize[0]
if im.Button("Remove Redundant BeamNGWaypoints") then
for _, node in pairs(self.path.pathnodes.objects) do
if scenetree.findObject(node.name) then
if im.Button("Align All Pathnodes to Grid") then
for _, node in pairs(self.path.pathnodes.objects) do
node.pos.x = round(node.pos.x)
@/lua/ge/extensions/career/modules/speedTraps.lua
local function hasLicensePlate(inventoryId)
for partId, part in pairs(career_modules_partInventory.getInventory()) do
if part.location == inventoryId then
@/lua/vehicle/extensions/tech/wheelForces.lua
for id, wd in pairs(wheels.wheels) do
local data = {}
for _, beamId in pairs(rimBeams) do
local rBeam = v.data.beams[beamId]
for _, beamId in pairs(sidewallBeams) do
local sBeam = v.data.beams[beamId]
for _, beamId in pairs(sidewallReinfBeams) do
local rBeam = v.data.beams[beamId]
--dump(v.data.beams)
for beamId, beam in pairs(v.data.beams) do
--we only care for non-rim beams
for _, treadNodeId in pairs(v.data.wheels[id].treadNodes) do
table.insert(data.treadNodes, treadNodeId)
@/lua/ge/extensions/util/calibrateESC.lua
local blacklistLookup = {}
for _, v in pairs(vehicleBlacklist) do
blacklistLookup[v] = true
local filteredConfigs = {}
for k, v in pairs(configs) do
if (not vehicleToTest or v.model_key == vehicleToTest) and ((not pcFileToTest or pcFileToTest == "") or v.key == pcFileToTest) and not blacklistLookup[v.model_key] then
local progressCount = 1
for _, v in pairs(filteredConfigs) do
local vehName = v.model_key
log("I", logTag, "Vehicles that are skipped:")
for _, value in pairs(vehicleBlacklist) do
log("I", logTag, value)
@/lua/ge/extensions/editor/terrainMaterialsEditor.lua
local values = {}
for map, asset in pairs(bulkChange.textures) do
if map == "b" then
-- remove obsolete v1 fields from terrain materials
for id, mtl in pairs(editor_terrainEditor.getMaterialsInJson()) do
mtl.material:setDiffuseMap("")
if im.CollapsingHeader1("Terrain Materials", im.TreeNodeFlags_DefaultOpen) then
for id, mtl in pairs(editor_terrainEditor.getMaterialsInJson()) do
if im.Selectable1(mtl.internalName .. "##Terrain Materials" .. id, name == mtl.internalName, nil,
local function showTerrainMaterialsEditor(internalName)
for id, mtl in pairs(editor_terrainEditor.getMaterialsInJson()) do
if mtl.internalName == internalName then
@/gameplay/missionTypes/chase/constructor.lua
unlockedStars.completeTraffic = false
for id, v in pairs(gameplay_traffic.getTrafficData()) do
if be:getObjectActive(id) and v.roleName == 'standard' then
@/lua/vehicle/electricsCustomValueParser.lua
--include all math functions and constants
for k, v in pairs(math) do
customElectricsEnv[k] = v
keyworkdWhiteListLookup = {}
for _, v in pairs(keywordWhiteList) do
keyworkdWhiteListLookup[v] = true
--TODO invesitgate if we maybe only want to update the values that are actually used within the custom value functions
for electricsName, electricsValue in pairs(electrics.values) do
customElectricsEnv.electrics[electricsName] = electricsValue
local function updateElectrics(dt)
for electricsName, customValue in pairs(customElectricsEnv.electrics) do
electrics.values[electricsName] = customValue
--dump(customDefaultValues)
for electricsName, value in pairs(customDefaultValues) do
electrics.values[electricsName] = value
@/lua/ge/extensions/flowgraph/nodes/gameplay/race/raceMarkers.lua
local wps = {}
for _, m in pairs(self.minimapMarkers) do
m.mode = 'hidden'
if self.pinIn.ignoreRecovery.value then
for k, v in pairs(wps) do
if v == 'recovery' then
--if not self.pinIn.raceData.value then return end
for _, m in pairs(self.minimapMarkers or {}) do
local clr = m.color
@/lua/ge/extensions/editor/dynamicDecals/docs.lua
im.Indent()
for k, v in pairs(section.children) do
checkSection(v, string.format("%s/%s", id, k))
@/lua/common/particles.lua
local function getOrAddMaterialIDByName(mats, s)
for k, v in pairs(mats) do
--print(" "..s.." == "..v.name)
local function getMaterialIDByName(mats, s)
for k,v in pairs(mats) do
--print(" "..s.." == "..v.name)
-- fix the constants
for k,v in pairs(particles) do
v.materialID1 = getOrAddMaterialIDByName(materials, v.materialID1)
local fields = {}
for kc,vc in pairs(comparefields) do
if v[kc] ~= "" then
@/lua/vehicle/controller/propAnimation/googlyEyes.lua
for cid, data in pairs(eyeBeamData) do
obj:setBeamLength(cid, data.defaultLength * sizeCoef)
local boundCoef = linearScale(sizeCoef, maxSizeCoef, minSizeCoef, maxSizeBoundCoef, minSizeBoundCoef)
for cid, data in pairs(eyeLimiterData) do
obj:setBoundedBeamLongBound(cid, data.defaultLongBound * boundCoef)
local attachmentCoef = linearScale(sizeCoef, minSizeCoef, maxSizeCoef, attachmentMinSizeCoef, attachmentMaxSizeCoef)
for cid, data in pairs(eyeAttachmentData) do
obj:setBeamLength(cid, data.defaultLength * attachmentCoef)
@/lua/ge/extensions/gameplay/delivery/delivery.lua
local lCount = 0
for _, loc in pairs(self.sites.locations.objects) do
if loc.customFields.tags[tag] then
@/lua/common/libs/lustach/src/lustache/renderer.lua
local max, n = 0, 0
for k, _ in pairs(array) do
if not (type(k) == "number" and k > 0 and math_floor(k) == k) then
@/ui/ui-vue/dist/index.js
`,overlayDiv.textContent=count$1.toString(),overlayElement.appendChild(overlayDiv),overlayDivs.set(element,overlayDiv)}catch{}}function updateOverlayText(){if(!overlayActive||overlayDivs.size===0)return;let appsStats=getUIAppsStats(),counts=appsStats.sortedList.map(item=>item.count),maxCount=Math.max(...counts,1),minCount=Math.min(...counts,0);for(let{element,count:count$1}of appsStats.sortedList){let overlayDiv=overlayDivs.get(element);overlayDiv&&(overlayDiv.textContent=count$1.toString(),overlayDiv.style.opacity=getOverlayOpacity(count$1,minCount,maxCount))}}function destroyOverlay(){overlayUpdateTimer&&=(clearInterval(overlayUpdateTimer),null),overlayDivs.forEach(overlayDiv=>overlayDiv.remove()),overlayDivs.clear(),overlayElement&&=(overlayElement.remove(),null),overlayActive=!1}function toggleOverlay(){return overlayActive?(destroyOverlay(),!1):(overlayActive=!0,createOverlay(),updateOverlayDivs(),overlayUpdateTimer=setInterval(updateOverlayText,500),!0)}function refreshOverlay(){overlayActive&&updateOverlayDivs()}var isBrowser=typeof document<`u`;function isRouteComponent(component){return typeof component==`object`||`displayName`in component||`props`in component||`__vccOpts`in component}function isESModule(obj){return obj.__esModule||obj[Symbol.toStringTag]===`Module`||obj.default&&isRouteComponent(obj.default)}var assign=Object.assign;function applyToParams(fn,params){let newParams={};for(let key in params){let value=params[key];newParams[key]=isArray(value)?value.map(fn):fn(value)}return newParams}var noop$1=()=>{},isArray=Array.isArray;function mergeOptions(defaults,partialOptions){let options={};for(let key in defaults)options[key]=key in partialOptions?partialOptions[key]:defaults[key];return options}var HASH_RE=/#/g,AMPERSAND_RE=/&/g,SLASH_RE=/\//g,EQUAL_RE=/=/g,IM_RE=/\?/g,PLUS_RE=/\+/g,ENC_BRACKET_OPEN_RE=/%5B/g,ENC_BRACKET_CLOSE_RE=/%5D/g,ENC_CARET_RE=/%5E/g,ENC_BACKTICK_RE=/%60/g,ENC_CURLY_OPEN_RE=/%7B/g,ENC_PIPE_RE=/%7C/g,ENC_CURLY_CLOSE_RE=/%7D/g,ENC_SPACE_RE=/%20/g;function commonEncode(text){return text==null?``:encodeURI(``+text).replace(ENC_PIPE_RE,`|`).replace(ENC_BRACKET_OPEN_RE,`[`).replace(ENC_BRACKET_CLOSE_RE,`]`)}function encodeHash(text){return commonEncode(text).replace(ENC_CURLY_OPEN_RE,`{`).replace(ENC_CURLY_CLOSE_RE,`}`).replace(ENC_CARET_RE,`^`)}function encodeQueryValue(text){return commonEncode(text).replace(PLUS_RE,`%2B`).replace(ENC_SPACE_RE,`+`).replace(HASH_RE,`%23`).replace(AMPERSAND_RE,`%26`).replace(ENC_BACKTICK_RE,"`").replace(ENC_CURLY_OPEN_RE,`{`).replace(ENC_CURLY_CLOSE_RE,`}`).replace(ENC_CARET_RE,`^`)}function encodeQueryKey(text){return encodeQueryValue(text).replace(EQUAL_RE,`%3D`)}function encodePath(text){return commonEncode(text).replace(HASH_RE,`%23`).replace(IM_RE,`%3F`)}function encodeParam(text){return encodePath(text).replace(SLASH_RE,`%2F`)}function decode(text){if(text==null)return null;try{return decodeURIComponent(``+text)}catch{}return``+text}var TRAILING_SLASH_RE=/\/$/,removeTrailingSlash=path=>path.replace(TRAILING_SLASH_RE,``);function parseURL(parseQuery$1,location$1,currentLocation=`/`){let path,query={},searchString=``,hash=``,hashPos=location$1.indexOf(`#`),searchPos=location$1.indexOf(`?`);return searchPos=hashPos>=0&&searchPos>hashPos?-1:searchPos,searchPos>=0&&(path=location$1.slice(0,searchPos),searchString=location$1.slice(searchPos,hashPos>0?hashPos:location$1.length),query=parseQuery$1(searchString.slice(1))),hashPos>=0&&(path||=location$1.slice(0,hashPos),hash=location$1.slice(hashPos,location$1.length)),path=resolveRelativePath(path??location$1,currentLocation),{fullPath:path+searchString+hash,path,query,hash:decode(hash)}}function stringifyURL(stringifyQuery$1,location$1){let query=location$1.query?stringifyQuery$1(location$1.query):``;return location$1.path+(query&&`?`)+query+(location$1.hash||``)}function stripBase(pathname,base){return!base||!pathname.toLowerCase().startsWith(base.toLowerCase())?pathname:pathname.slice(base.length)||`/`}function isSameRouteLocation(stringifyQuery$1,a$1,b){let aLastIndex=a$1.matched.length-1,bLastIndex=b.matched.length-1;return aLastIndex>-1&&aLastIndex===bLastIndex&&isSameRouteRecord(a$1.matched[aLastIndex],b.matched[bLastIndex])&&isSameRouteLocationParams(a$1.params,b.params)&&stringifyQuery$1(a$1.query)===stringifyQuery$1(b.query)&&a$1.hash===b.hash}function isSameRouteRecord(a$1,b){return(a$1.aliasOf||a$1)===(b.aliasOf||b)}function isSameRouteLocationParams(a$1,b){if(Object.keys(a$1).length!==Object.keys(b).length)return!1;for(let key in a$1)if(!isSameRouteLocationParamsValue(a$1[key],b[key]))return!1;return!0}function isSameRouteLocationParamsValue(a$1,b){return isArray(a$1)?isEquivalentArray(a$1,b):isArray(b)?isEquivalentArray(b,a$1):a$1===b}function isEquivalentArray(a$1,b){return isArray(b)?a$1.length===b.length&&a$1.every((value,i)=>value===b[i]):a$1.length===1&&a$1[0]===b}function resolveRelativePath(to,from){if(to.startsWith(`/`))return to;if(!to)return from;let fromSegments=from.split(`/`),toSegments=to.split(`/`),lastToSegment=toSegments[toSegments.length-1];(lastToSegment===`..`||lastToSegment===`.`)&&toSegments.push(``);let position=fromSegments.length-1,toPosition,segment;for(toPosition=0;toPosition1&&position--;else break;return fromSegments.slice(0,position).join(`/`)+`/`+toSegments.slice(toPosition).join(`/`)}var START_LOCATION_NORMALIZED={path:`/`,name:void 0,params:{},query:{},hash:``,fullPath:`/`,matched:[],meta:{},redirectedFrom:void 0},NavigationType=function(NavigationType$1){return NavigationType$1.pop=`pop`,NavigationType$1.push=`push`,NavigationType$1}({}),NavigationDirection=function(NavigationDirection$1){return NavigationDirection$1.back=`back`,NavigationDirection$1.forward=`forward`,NavigationDirection$1.unknown=``,NavigationDirection$1}({});function normalizeBase(base){if(!base)if(isBrowser){let baseEl=document.querySelector(`base`);base=baseEl&&baseEl.getAttribute(`href`)||`/`,base=base.replace(/^\w+:\/\/[^\/]+/,``)}else base=`/`;return base[0]!==`/`&&base[0]!==`#`&&(base=`/`+base),removeTrailingSlash(base)}var BEFORE_HASH_RE=/^[^#]+#/;function createHref(base,location$1){return base.replace(BEFORE_HASH_RE,`#`)+location$1}function getElementPosition(el,offset$2){let docRect=document.documentElement.getBoundingClientRect(),elRect=el.getBoundingClientRect();return{behavior:offset$2.behavior,left:elRect.left-docRect.left-(offset$2.left||0),top:elRect.top-docRect.top-(offset$2.top||0)}}var computeScrollPosition=()=>({left:window.scrollX,top:window.scrollY});function scrollToPosition(position){let scrollToOptions;if(`el`in position){let positionEl=position.el,isIdSelector=typeof positionEl==`string`&&positionEl.startsWith(`#`),el=typeof positionEl==`string`?isIdSelector?document.getElementById(positionEl.slice(1)):document.querySelector(positionEl):positionEl;if(!el)return;scrollToOptions=getElementPosition(el,position)}else scrollToOptions=position;`scrollBehavior`in document.documentElement.style?window.scrollTo(scrollToOptions):window.scrollTo(scrollToOptions.left==null?window.scrollX:scrollToOptions.left,scrollToOptions.top==null?window.scrollY:scrollToOptions.top)}function getScrollKey(path,delta){return(history.state?history.state.position-delta:-1)+path}var scrollPositions=new Map;function saveScrollPosition(key,scrollPosition){scrollPositions.set(key,scrollPosition)}function getSavedScrollPosition(key){let scroll$1=scrollPositions.get(key);return scrollPositions.delete(key),scroll$1}function isRouteLocation(route){return typeof route==`string`||route&&typeof route==`object`}function isRouteName(name){return typeof name==`string`||typeof name==`symbol`}var ErrorTypes=function(ErrorTypes$1){return ErrorTypes$1[ErrorTypes$1.MATCHER_NOT_FOUND=1]=`MATCHER_NOT_FOUND`,ErrorTypes$1[ErrorTypes$1.NAVIGATION_GUARD_REDIRECT=2]=`NAVIGATION_GUARD_REDIRECT`,ErrorTypes$1[ErrorTypes$1.NAVIGATION_ABORTED=4]=`NAVIGATION_ABORTED`,ErrorTypes$1[ErrorTypes$1.NAVIGATION_CANCELLED=8]=`NAVIGATION_CANCELLED`,ErrorTypes$1[ErrorTypes$1.NAVIGATION_DUPLICATED=16]=`NAVIGATION_DUPLICATED`,ErrorTypes$1}({}),NavigationFailureSymbol=Symbol(``);ErrorTypes.MATCHER_NOT_FOUND,ErrorTypes.NAVIGATION_GUARD_REDIRECT,ErrorTypes.NAVIGATION_ABORTED,ErrorTypes.NAVIGATION_CANCELLED,ErrorTypes.NAVIGATION_DUPLICATED;function createRouterError(type,params){return assign(Error(),{type,[NavigationFailureSymbol]:!0},params)}function isNavigationFailure(error,type){return error instanceof Error&&NavigationFailureSymbol in error&&(type==null||!!(error.type&type))}function parseQuery(search$1){let query={};if(search$1===``||search$1===`?`)return query;let searchParams=(search$1[0]===`?`?search$1.slice(1):search$1).split(`&`);for(let i=0;iv&&encodeQueryValue(v)):[value&&encodeQueryValue(value)]).forEach(value$1=>{value$1!==void 0&&(search$1+=(search$1.length?`&`:``)+key,value$1!=null&&(search$1+=`=`+value$1))})}return search$1}function normalizeQuery(query){let normalizedQuery={};for(let key in query){let value=query[key];value!==void 0&&(normalizedQuery[key]=isArray(value)?value.map(v=>v==null?null:``+v):value==null?value:``+value)}return normalizedQuery}var matchedRouteKey=Symbol(``),viewDepthKey=Symbol(``),routerKey=Symbol(``),routeLocationKey=Symbol(``),routerViewLocationKey=Symbol(``);function useCallbacks(){let handlers$1=[];function add$2(handler$1){return handlers$1.push(handler$1),()=>{let i=handlers$1.indexOf(handler$1);i>-1&&handlers$1.splice(i,1)}}function reset$1(){handlers$1=[]}return{add:add$2,list:()=>handlers$1.slice(),reset:reset$1}}function guardToPromiseFn(guard,to,from,record,name,runWithContext=fn=>fn()){let enterCallbackArray=record&&(record.enterCallbacks[name]=record.enterCallbacks[name]||[]);return()=>new Promise((resolve$1,reject)=>{let next=valid=>{valid===!1?reject(createRouterError(ErrorTypes.NAVIGATION_ABORTED,{from,to})):valid instanceof Error?reject(valid):isRouteLocation(valid)?reject(createRouterError(ErrorTypes.NAVIGATION_GUARD_REDIRECT,{from:to,to:valid})):(enterCallbackArray&&record.enterCallbacks[name]===enterCallbackArray&&typeof valid==`function`&&enterCallbackArray.push(valid),resolve$1())},guardReturn=runWithContext(()=>guard.call(record&&record.instances[name],to,from,next)),guardCall=Promise.resolve(guardReturn);guard.length<3&&(guardCall=guardCall.then(next)),guardCall.catch(err=>reject(err))})}function extractComponentsGuards(matched,guardType,to,from,runWithContext=fn=>fn()){let guards=[];for(let record of matched)for(let name in record.components){let rawComponent=record.components[name];if(!(guardType!==`beforeRouteEnter`&&!record.instances[name]))if(isRouteComponent(rawComponent)){let guard=(rawComponent.__vccOpts||rawComponent)[guardType];guard&&guards.push(guardToPromiseFn(guard,to,from,record,name,runWithContext))}else{let componentPromise=rawComponent();guards.push(()=>componentPromise.then(resolved=>{if(!resolved)throw Error(`Couldn't resolve component "${name}" at "${record.path}"`);let resolvedComponent=isESModule(resolved)?resolved.default:resolved;record.mods[name]=resolved,record.components[name]=resolvedComponent;let guard=(resolvedComponent.__vccOpts||resolvedComponent)[guardType];return guard&&guardToPromiseFn(guard,to,from,record,name,runWithContext)()}))}}return guards}function extractChangingRecords(to,from){let leavingRecords=[],updatingRecords=[],enteringRecords=[],len=Math.max(from.matched.length,to.matched.length);for(let i=0;iisSameRouteRecord(record,recordFrom))?updatingRecords.push(recordFrom):leavingRecords.push(recordFrom));let recordTo=to.matched[i];recordTo&&(from.matched.find(record=>isSameRouteRecord(record,recordTo))||enteringRecords.push(recordTo))}return[leavingRecords,updatingRecords,enteringRecords]}var createBaseLocation=()=>location.protocol+`//`+location.host;function createCurrentLocation(base,location$1){let{pathname,search:search$1,hash}=location$1,hashPos=base.indexOf(`#`);if(hashPos>-1){let slicePos=hash.includes(base.slice(hashPos))?base.slice(hashPos).length:1,pathFromHash=hash.slice(slicePos);return pathFromHash[0]!==`/`&&(pathFromHash=`/`+pathFromHash),stripBase(pathFromHash,``)}return stripBase(pathname,base)+search$1+hash}function useHistoryListeners(base,historyState,currentLocation,replace){let listeners=[],teardowns=[],pauseState=null,popStateHandler=({state})=>{let to=createCurrentLocation(base,location),from=currentLocation.value,fromState=historyState.value,delta=0;if(state){if(currentLocation.value=to,historyState.value=state,pauseState&&pauseState===from){pauseState=null;return}delta=fromState?state.position-fromState.position:0}else replace(to);listeners.forEach(listener=>{listener(currentLocation.value,from,{delta,type:NavigationType.pop,direction:delta?delta>0?NavigationDirection.forward:NavigationDirection.back:NavigationDirection.unknown})})};function pauseListeners(){pauseState=currentLocation.value}function listen(callback){listeners.push(callback);let teardown=()=>{let index=listeners.indexOf(callback);index>-1&&listeners.splice(index,1)};return teardowns.push(teardown),teardown}function beforeUnloadListener(){if(document.visibilityState===`hidden`){let{history:history$1}=window;if(!history$1.state)return;history$1.replaceState(assign({},history$1.state,{scroll:computeScrollPosition()}),``)}}function destroy$1(){for(let teardown of teardowns)teardown();teardowns=[],window.removeEventListener(`popstate`,popStateHandler),window.removeEventListener(`pagehide`,beforeUnloadListener),document.removeEventListener(`visibilitychange`,beforeUnloadListener)}return window.addEventListener(`popstate`,popStateHandler),window.addEventListener(`pagehide`,beforeUnloadListener),document.addEventListener(`visibilitychange`,beforeUnloadListener),{pauseListeners,listen,destroy:destroy$1}}function buildState(back,current,forward,replaced=!1,computeScroll=!1){return{back,current,forward,replaced,position:window.history.length,scroll:computeScroll?computeScrollPosition():null}}function useHistoryStateNavigation(base){let{history:history$1,location:location$1}=window,currentLocation={value:createCurrentLocation(base,location$1)},historyState={value:history$1.state};historyState.value||changeLocation(currentLocation.value,{back:null,current:currentLocation.value,forward:null,position:history$1.length-1,replaced:!0,scroll:null},!0);function changeLocation(to,state,replace$1){let hashIndex=base.indexOf(`#`),url=hashIndex>-1?(location$1.host&&document.querySelector(`base`)?base:base.slice(hashIndex))+to:createBaseLocation()+base+to;try{history$1[replace$1?`replaceState`:`pushState`](state,``,url),historyState.value=state}catch(err){console.error(err),location$1[replace$1?`replace`:`assign`](url)}}function replace(to,data){changeLocation(to,assign({},history$1.state,buildState(historyState.value.back,to,historyState.value.forward,!0),data,{position:historyState.value.position}),!0),currentLocation.value=to}function push(to,data){let currentState=assign({},historyState.value,history$1.state,{forward:to,scroll:computeScrollPosition()});changeLocation(currentState.current,currentState,!0),changeLocation(to,assign({},buildState(currentLocation.value,to,null),{position:currentState.position+1},data),!1),currentLocation.value=to}return{location:currentLocation,state:historyState,push,replace}}function createWebHistory(base){base=normalizeBase(base);let historyNavigation=useHistoryStateNavigation(base),historyListeners=useHistoryListeners(base,historyNavigation.state,historyNavigation.location,historyNavigation.replace);function go(delta,triggerListeners=!0){triggerListeners||historyListeners.pauseListeners(),history.go(delta)}let routerHistory=assign({location:``,base,go,createHref:createHref.bind(null,base)},historyNavigation,historyListeners);return Object.defineProperty(routerHistory,`location`,{enumerable:!0,get:()=>historyNavigation.location.value}),Object.defineProperty(routerHistory,`state`,{enumerable:!0,get:()=>historyNavigation.state.value}),routerHistory}function createWebHashHistory(base){return base=location.host?base||location.pathname+location.search:``,base.includes(`#`)||(base+=`#`),createWebHistory(base)}var TokenType=function(TokenType$1){return TokenType$1[TokenType$1.Static=0]=`Static`,TokenType$1[TokenType$1.Param=1]=`Param`,TokenType$1[TokenType$1.Group=2]=`Group`,TokenType$1}({}),TokenizerState=function(TokenizerState$1){return TokenizerState$1[TokenizerState$1.Static=0]=`Static`,TokenizerState$1[TokenizerState$1.Param=1]=`Param`,TokenizerState$1[TokenizerState$1.ParamRegExp=2]=`ParamRegExp`,TokenizerState$1[TokenizerState$1.ParamRegExpEnd=3]=`ParamRegExpEnd`,TokenizerState$1[TokenizerState$1.EscapeNext=4]=`EscapeNext`,TokenizerState$1}(TokenizerState||{}),ROOT_TOKEN={type:TokenType.Static,value:``},VALID_PARAM_RE=/[a-zA-Z0-9_]/;function tokenizePath(path){if(!path)return[[]];if(path===`/`)return[[ROOT_TOKEN]];if(!path.startsWith(`/`))throw Error(`Invalid path "${path}"`);function crash(message){throw Error(`ERR (${state})/"${buffer$1}": ${message}`)}let state=TokenizerState.Static,previousState=state,tokens=[],segment;function finalizeSegment(){segment&&tokens.push(segment),segment=[]}let i=0,char,buffer$1=``,customRe=``;function consumeBuffer(){buffer$1&&=(state===TokenizerState.Static?segment.push({type:TokenType.Static,value:buffer$1}):state===TokenizerState.Param||state===TokenizerState.ParamRegExp||state===TokenizerState.ParamRegExpEnd?(segment.length>1&&(char===`*`||char===`+`)&&crash(`A repeatable param (${buffer$1}) must be alone in its segment. eg: '/:ids+.`),segment.push({type:TokenType.Param,value:buffer$1,regexp:customRe,repeatable:char===`*`||char===`+`,optional:char===`*`||char===`?`})):crash(`Invalid state to consume buffer`),``)}function addCharToBuffer(){buffer$1+=char}for(;ib.length?b.length===1&&b[0]===PathScore.Static+PathScore.Segment?1:-1:0}function comparePathParserScore(a$1,b){let i=0,aScore=a$1.score,bScore=b.score;for(;i0&&last[last.length-1]<0}var PATH_PARSER_OPTIONS_DEFAULTS={strict:!1,end:!0,sensitive:!1};function createRouteRecordMatcher(record,parent,options){let matcher=assign(tokensToParser(tokenizePath(record.path),options),{record,parent,children:[],alias:[]});return parent&&!matcher.record.aliasOf==!parent.record.aliasOf&&parent.children.push(matcher),matcher}function createRouterMatcher(routes,globalOptions){let matchers=[],matcherMap=new Map;globalOptions=mergeOptions(PATH_PARSER_OPTIONS_DEFAULTS,globalOptions);function getRecordMatcher(name){return matcherMap.get(name)}function addRoute(record,parent,originalRecord){let isRootAdd=!originalRecord,mainNormalizedRecord=normalizeRouteRecord(record);mainNormalizedRecord.aliasOf=originalRecord&&originalRecord.record;let options=mergeOptions(globalOptions,record),normalizedRecords=[mainNormalizedRecord];if(`alias`in record){let aliases=typeof record.alias==`string`?[record.alias]:record.alias;for(let alias of aliases)normalizedRecords.push(normalizeRouteRecord(assign({},mainNormalizedRecord,{components:originalRecord?originalRecord.record.components:mainNormalizedRecord.components,path:alias,aliasOf:originalRecord?originalRecord.record:mainNormalizedRecord})))}let matcher,originalMatcher;for(let normalizedRecord of normalizedRecords){let{path}=normalizedRecord;if(parent&&path[0]!==`/`){let parentPath=parent.record.path,connectingSlash=parentPath[parentPath.length-1]===`/`?``:`/`;normalizedRecord.path=parent.record.path+(path&&connectingSlash+path)}if(matcher=createRouteRecordMatcher(normalizedRecord,parent,options),originalRecord?originalRecord.alias.push(matcher):(originalMatcher||=matcher,originalMatcher!==matcher&&originalMatcher.alias.push(matcher),isRootAdd&&record.name&&!isAliasRecord(matcher)&&removeRoute(record.name)),isMatchable(matcher)&&insertMatcher(matcher),mainNormalizedRecord.children){let children=mainNormalizedRecord.children;for(let i=0;i{removeRoute(originalMatcher)}:noop$1}function removeRoute(matcherRef){if(isRouteName(matcherRef)){let matcher=matcherMap.get(matcherRef);matcher&&(matcherMap.delete(matcherRef),matchers.splice(matchers.indexOf(matcher),1),matcher.children.forEach(removeRoute),matcher.alias.forEach(removeRoute))}else{let index=matchers.indexOf(matcherRef);index>-1&&(matchers.splice(index,1),matcherRef.record.name&&matcherMap.delete(matcherRef.record.name),matcherRef.children.forEach(removeRoute),matcherRef.alias.forEach(removeRoute))}}function getRoutes(){return matchers}function insertMatcher(matcher){let index=findInsertionIndex(matcher,matchers);matchers.splice(index,0,matcher),matcher.record.name&&!isAliasRecord(matcher)&&matcherMap.set(matcher.record.name,matcher)}function resolve$1(location$1,currentLocation){let matcher,params={},path,name;if(`name`in location$1&&location$1.name){if(matcher=matcherMap.get(location$1.name),!matcher)throw createRouterError(ErrorTypes.MATCHER_NOT_FOUND,{location:location$1});name=matcher.record.name,params=assign(pickParams(currentLocation.params,matcher.keys.filter(k=>!k.optional).concat(matcher.parent?matcher.parent.keys.filter(k=>k.optional):[]).map(k=>k.name)),location$1.params&&pickParams(location$1.params,matcher.keys.map(k=>k.name))),path=matcher.stringify(params)}else if(location$1.path!=null)path=location$1.path,matcher=matchers.find(m=>m.re.test(path)),matcher&&(params=matcher.parse(path),name=matcher.record.name);else{if(matcher=currentLocation.name?matcherMap.get(currentLocation.name):matchers.find(m=>m.re.test(currentLocation.path)),!matcher)throw createRouterError(ErrorTypes.MATCHER_NOT_FOUND,{location:location$1,currentLocation});name=matcher.record.name,params=assign({},currentLocation.params,location$1.params),path=matcher.stringify(params)}let matched=[],parentMatcher=matcher;for(;parentMatcher;)matched.unshift(parentMatcher.record),parentMatcher=parentMatcher.parent;return{name,path,params,matched,meta:mergeMetaFields(matched)}}routes.forEach(route=>addRoute(route));function clearRoutes(){matchers.length=0,matcherMap.clear()}return{addRoute,resolve:resolve$1,removeRoute,clearRoutes,getRoutes,getRecordMatcher}}function pickParams(params,keys){let newParams={};for(let key of keys)key in params&&(newParams[key]=params[key]);return newParams}function normalizeRouteRecord(record){let normalized={path:record.path,redirect:record.redirect,name:record.name,meta:record.meta||{},aliasOf:record.aliasOf,beforeEnter:record.beforeEnter,props:normalizeRecordProps(record),children:record.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:`components`in record?record.components||null:record.component&&{default:record.component}};return Object.defineProperty(normalized,`mods`,{value:{}}),normalized}function normalizeRecordProps(record){let propsObject={},props=record.props||!1;if(`component`in record)propsObject.default=props;else for(let name in record.components)propsObject[name]=typeof props==`object`?props[name]:props;return propsObject}function isAliasRecord(record){for(;record;){if(record.record.aliasOf)return!0;record=record.parent}return!1}function mergeMetaFields(matched){return matched.reduce((meta,record)=>assign(meta,record.meta),{})}function findInsertionIndex(matcher,matchers){let lower=0,upper=matchers.length;for(;lower!==upper;){let mid=lower+upper>>1;comparePathParserScore(matcher,matchers[mid])<0?upper=mid:lower=mid+1}let insertionAncestor=getInsertionAncestor(matcher);return insertionAncestor&&(upper=matchers.lastIndexOf(insertionAncestor,upper-1)),upper}function getInsertionAncestor(matcher){let ancestor=matcher;for(;ancestor=ancestor.parent;)if(isMatchable(ancestor)&&comparePathParserScore(matcher,ancestor)===0)return ancestor}function isMatchable({record}){return!!(record.name||record.components&&Object.keys(record.components).length||record.redirect)}function useLink(props){let router$1=inject(routerKey),currentRoute=inject(routeLocationKey),route=computed(()=>{let to=unref(props.to);return router$1.resolve(to)}),activeRecordIndex=computed(()=>{let{matched}=route.value,{length}=matched,routeMatched=matched[length-1],currentMatched=currentRoute.matched;if(!routeMatched||!currentMatched.length)return-1;let index=currentMatched.findIndex(isSameRouteRecord.bind(null,routeMatched));if(index>-1)return index;let parentRecordPath=getOriginalPath(matched[length-2]);return length>1&&getOriginalPath(routeMatched)===parentRecordPath&¤tMatched[currentMatched.length-1].path!==parentRecordPath?currentMatched.findIndex(isSameRouteRecord.bind(null,matched[length-2])):index}),isActive=computed(()=>activeRecordIndex.value>-1&&includesParams(currentRoute.params,route.value.params)),isExactActive=computed(()=>activeRecordIndex.value>-1&&activeRecordIndex.value===currentRoute.matched.length-1&&isSameRouteLocationParams(currentRoute.params,route.value.params));function navigate$1(e={}){if(guardEvent(e)){let p$1=router$1[unref(props.replace)?`replace`:`push`](unref(props.to)).catch(noop$1);return props.viewTransition&&typeof document<`u`&&`startViewTransition`in document&&document.startViewTransition(()=>p$1),p$1}return Promise.resolve()}return{route,href:computed(()=>route.value.href),isActive,isExactActive,navigate:navigate$1}}function preferSingleVNode(vnodes){return vnodes.length===1?vnodes[0]:vnodes}var RouterLink=defineComponent({name:`RouterLink`,compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:`page`},viewTransition:Boolean},useLink,setup(props,{slots}){let link=reactive(useLink(props)),{options}=inject(routerKey),elClass=computed(()=>({[getLinkClass(props.activeClass,options.linkActiveClass,`router-link-active`)]:link.isActive,[getLinkClass(props.exactActiveClass,options.linkExactActiveClass,`router-link-exact-active`)]:link.isExactActive}));return()=>{let children=slots.default&&preferSingleVNode(slots.default(link));return props.custom?children:h(`a`,{"aria-current":link.isExactActive?props.ariaCurrentValue:null,href:link.href,onClick:link.navigate,class:elClass.value},children)}}});function guardEvent(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){let target=e.currentTarget.getAttribute(`target`);if(/\b_blank\b/i.test(target))return}return e.preventDefault&&e.preventDefault(),!0}}function includesParams(outer,inner){for(let key in inner){let innerValue=inner[key],outerValue=outer[key];if(typeof innerValue==`string`){if(innerValue!==outerValue)return!1}else if(!isArray(outerValue)||outerValue.length!==innerValue.length||innerValue.some((value,i)=>value!==outerValue[i]))return!1}return!0}function getOriginalPath(record){return record?record.aliasOf?record.aliasOf.path:record.path:``}var getLinkClass=(propClass,globalClass,defaultClass)=>propClass??globalClass??defaultClass,RouterViewImpl=defineComponent({name:`RouterView`,inheritAttrs:!1,props:{name:{type:String,default:`default`},route:Object},compatConfig:{MODE:3},setup(props,{attrs,slots}){let injectedRoute=inject(routerViewLocationKey),routeToDisplay=computed(()=>props.route||injectedRoute.value),injectedDepth=inject(viewDepthKey,0),depth=computed(()=>{let initialDepth=unref(injectedDepth),{matched}=routeToDisplay.value,matchedRoute;for(;(matchedRoute=matched[initialDepth])&&!matchedRoute.components;)initialDepth++;return initialDepth}),matchedRouteRef=computed(()=>routeToDisplay.value.matched[depth.value]);provide(viewDepthKey,computed(()=>depth.value+1)),provide(matchedRouteKey,matchedRouteRef),provide(routerViewLocationKey,routeToDisplay);let viewRef=ref();return watch(()=>[viewRef.value,matchedRouteRef.value,props.name],([instance$1,to,name],[oldInstance,from,oldName])=>{to&&(to.instances[name]=instance$1,from&&from!==to&&instance$1&&instance$1===oldInstance&&(to.leaveGuards.size||(to.leaveGuards=from.leaveGuards),to.updateGuards.size||(to.updateGuards=from.updateGuards))),instance$1&&to&&(!from||!isSameRouteRecord(to,from)||!oldInstance)&&(to.enterCallbacks[name]||[]).forEach(callback=>callback(instance$1))},{flush:`post`}),()=>{let route=routeToDisplay.value,currentName=props.name,matchedRoute=matchedRouteRef.value,ViewComponent=matchedRoute&&matchedRoute.components[currentName];if(!ViewComponent)return normalizeSlot(slots.default,{Component:ViewComponent,route});let routePropsOption=matchedRoute.props[currentName],component=h(ViewComponent,assign({},routePropsOption?routePropsOption===!0?route.params:typeof routePropsOption==`function`?routePropsOption(route):routePropsOption:null,attrs,{onVnodeUnmounted:vnode=>{vnode.component.isUnmounted&&(matchedRoute.instances[currentName]=null)},ref:viewRef}));return normalizeSlot(slots.default,{Component:component,route})||component}}});function normalizeSlot(slot,data){if(!slot)return null;let slotContent=slot(data);return slotContent.length===1?slotContent[0]:slotContent}var RouterView=RouterViewImpl;function createRouter(options){let matcher=createRouterMatcher(options.routes,options),parseQuery$1=options.parseQuery||parseQuery,stringifyQuery$1=options.stringifyQuery||stringifyQuery,routerHistory=options.history,beforeGuards=useCallbacks(),beforeResolveGuards=useCallbacks(),afterGuards=useCallbacks(),currentRoute=shallowRef(START_LOCATION_NORMALIZED),pendingLocation=START_LOCATION_NORMALIZED;isBrowser&&options.scrollBehavior&&`scrollRestoration`in history&&(history.scrollRestoration=`manual`);let normalizeParams=applyToParams.bind(null,paramValue=>``+paramValue),encodeParams=applyToParams.bind(null,encodeParam),decodeParams=applyToParams.bind(null,decode);function addRoute(parentOrRoute,route){let parent,record;return isRouteName(parentOrRoute)?(parent=matcher.getRecordMatcher(parentOrRoute),record=route):record=parentOrRoute,matcher.addRoute(record,parent)}function removeRoute(name){let recordMatcher=matcher.getRecordMatcher(name);recordMatcher&&matcher.removeRoute(recordMatcher)}function getRoutes(){return matcher.getRoutes().map(routeMatcher=>routeMatcher.record)}function hasRoute(name){return!!matcher.getRecordMatcher(name)}function resolve$1(rawLocation,currentLocation){if(currentLocation=assign({},currentLocation||currentRoute.value),typeof rawLocation==`string`){let locationNormalized=parseURL(parseQuery$1,rawLocation,currentLocation.path),matchedRoute$1=matcher.resolve({path:locationNormalized.path},currentLocation),href$1=routerHistory.createHref(locationNormalized.fullPath);return assign(locationNormalized,matchedRoute$1,{params:decodeParams(matchedRoute$1.params),hash:decode(locationNormalized.hash),redirectedFrom:void 0,href:href$1})}let matcherLocation;if(rawLocation.path!=null)matcherLocation=assign({},rawLocation,{path:parseURL(parseQuery$1,rawLocation.path,currentLocation.path).path});else{let targetParams=assign({},rawLocation.params);for(let key in targetParams)targetParams[key]??delete targetParams[key];matcherLocation=assign({},rawLocation,{params:encodeParams(targetParams)}),currentLocation.params=encodeParams(currentLocation.params)}let matchedRoute=matcher.resolve(matcherLocation,currentLocation),hash=rawLocation.hash||``;matchedRoute.params=normalizeParams(decodeParams(matchedRoute.params));let fullPath=stringifyURL(stringifyQuery$1,assign({},rawLocation,{hash:encodeHash(hash),path:matchedRoute.path})),href=routerHistory.createHref(fullPath);return assign({fullPath,hash,query:stringifyQuery$1===stringifyQuery?normalizeQuery(rawLocation.query):rawLocation.query||{}},matchedRoute,{redirectedFrom:void 0,href})}function locationAsObject(to){return typeof to==`string`?parseURL(parseQuery$1,to,currentRoute.value.path):assign({},to)}function checkCanceledNavigation(to,from){if(pendingLocation!==to)return createRouterError(ErrorTypes.NAVIGATION_CANCELLED,{from,to})}function push(to){return pushWithRedirect(to)}function replace(to){return push(assign(locationAsObject(to),{replace:!0}))}function handleRedirectRecord(to,from){let lastMatched=to.matched[to.matched.length-1];if(lastMatched&&lastMatched.redirect){let{redirect}=lastMatched,newTargetLocation=typeof redirect==`function`?redirect(to,from):redirect;return typeof newTargetLocation==`string`&&(newTargetLocation=newTargetLocation.includes(`?`)||newTargetLocation.includes(`#`)?newTargetLocation=locationAsObject(newTargetLocation):{path:newTargetLocation},newTargetLocation.params={}),assign({query:to.query,hash:to.hash,params:newTargetLocation.path==null?to.params:{}},newTargetLocation)}}function pushWithRedirect(to,redirectedFrom){let targetLocation=pendingLocation=resolve$1(to),from=currentRoute.value,data=to.state,force=to.force,replace$1=to.replace===!0,shouldRedirect=handleRedirectRecord(targetLocation,from);if(shouldRedirect)return pushWithRedirect(assign(locationAsObject(shouldRedirect),{state:typeof shouldRedirect==`object`?assign({},data,shouldRedirect.state):data,force,replace:replace$1}),redirectedFrom||targetLocation);let toLocation=targetLocation;toLocation.redirectedFrom=redirectedFrom;let failure;return!force&&isSameRouteLocation(stringifyQuery$1,from,targetLocation)&&(failure=createRouterError(ErrorTypes.NAVIGATION_DUPLICATED,{to:toLocation,from}),handleScroll(from,from,!0,!1)),(failure?Promise.resolve(failure):navigate$1(toLocation,from)).catch(error=>isNavigationFailure(error)?isNavigationFailure(error,ErrorTypes.NAVIGATION_GUARD_REDIRECT)?error:markAsReady(error):triggerError(error,toLocation,from)).then(failure$1=>{if(failure$1){if(isNavigationFailure(failure$1,ErrorTypes.NAVIGATION_GUARD_REDIRECT))return pushWithRedirect(assign({replace:replace$1},locationAsObject(failure$1.to),{state:typeof failure$1.to==`object`?assign({},data,failure$1.to.state):data,force}),redirectedFrom||toLocation)}else failure$1=finalizeNavigation(toLocation,from,!0,replace$1,data);return triggerAfterEach(toLocation,from,failure$1),failure$1})}function checkCanceledNavigationAndReject(to,from){let error=checkCanceledNavigation(to,from);return error?Promise.reject(error):Promise.resolve()}function runWithContext(fn){let app$1=installedApps.values().next().value;return app$1&&typeof app$1.runWithContext==`function`?app$1.runWithContext(fn):fn()}function navigate$1(to,from){let guards,[leavingRecords,updatingRecords,enteringRecords]=extractChangingRecords(to,from);guards=extractComponentsGuards(leavingRecords.reverse(),`beforeRouteLeave`,to,from);for(let record of leavingRecords)record.leaveGuards.forEach(guard=>{guards.push(guardToPromiseFn(guard,to,from))});let canceledNavigationCheck=checkCanceledNavigationAndReject.bind(null,to,from);return guards.push(canceledNavigationCheck),runGuardQueue(guards).then(()=>{guards=[];for(let guard of beforeGuards.list())guards.push(guardToPromiseFn(guard,to,from));return guards.push(canceledNavigationCheck),runGuardQueue(guards)}).then(()=>{guards=extractComponentsGuards(updatingRecords,`beforeRouteUpdate`,to,from);for(let record of updatingRecords)record.updateGuards.forEach(guard=>{guards.push(guardToPromiseFn(guard,to,from))});return guards.push(canceledNavigationCheck),runGuardQueue(guards)}).then(()=>{guards=[];for(let record of enteringRecords)if(record.beforeEnter)if(isArray(record.beforeEnter))for(let beforeEnter of record.beforeEnter)guards.push(guardToPromiseFn(beforeEnter,to,from));else guards.push(guardToPromiseFn(record.beforeEnter,to,from));return guards.push(canceledNavigationCheck),runGuardQueue(guards)}).then(()=>(to.matched.forEach(record=>record.enterCallbacks={}),guards=extractComponentsGuards(enteringRecords,`beforeRouteEnter`,to,from,runWithContext),guards.push(canceledNavigationCheck),runGuardQueue(guards))).then(()=>{guards=[];for(let guard of beforeResolveGuards.list())guards.push(guardToPromiseFn(guard,to,from));return guards.push(canceledNavigationCheck),runGuardQueue(guards)}).catch(err=>isNavigationFailure(err,ErrorTypes.NAVIGATION_CANCELLED)?err:Promise.reject(err))}function triggerAfterEach(to,from,failure){afterGuards.list().forEach(guard=>runWithContext(()=>guard(to,from,failure)))}function finalizeNavigation(toLocation,from,isPush,replace$1,data){let error=checkCanceledNavigation(toLocation,from);if(error)return error;let isFirstNavigation=from===START_LOCATION_NORMALIZED,state=isBrowser?history.state:{};isPush&&(replace$1||isFirstNavigation?routerHistory.replace(toLocation.fullPath,assign({scroll:isFirstNavigation&&state&&state.scroll},data)):routerHistory.push(toLocation.fullPath,data)),currentRoute.value=toLocation,handleScroll(toLocation,from,isPush,isFirstNavigation),markAsReady()}let removeHistoryListener;function setupListeners(){removeHistoryListener||=routerHistory.listen((to,_from,info)=>{if(!router$1.listening)return;let toLocation=resolve$1(to),shouldRedirect=handleRedirectRecord(toLocation,router$1.currentRoute.value);if(shouldRedirect){pushWithRedirect(assign(shouldRedirect,{replace:!0,force:!0}),toLocation).catch(noop$1);return}pendingLocation=toLocation;let from=currentRoute.value;isBrowser&&saveScrollPosition(getScrollKey(from.fullPath,info.delta),computeScrollPosition()),navigate$1(toLocation,from).catch(error=>isNavigationFailure(error,ErrorTypes.NAVIGATION_ABORTED|ErrorTypes.NAVIGATION_CANCELLED)?error:isNavigationFailure(error,ErrorTypes.NAVIGATION_GUARD_REDIRECT)?(pushWithRedirect(assign(locationAsObject(error.to),{force:!0}),toLocation).then(failure=>{isNavigationFailure(failure,ErrorTypes.NAVIGATION_ABORTED|ErrorTypes.NAVIGATION_DUPLICATED)&&!info.delta&&info.type===NavigationType.pop&&routerHistory.go(-1,!1)}).catch(noop$1),Promise.reject()):(info.delta&&routerHistory.go(-info.delta,!1),triggerError(error,toLocation,from))).then(failure=>{failure||=finalizeNavigation(toLocation,from,!1),failure&&(info.delta&&!isNavigationFailure(failure,ErrorTypes.NAVIGATION_CANCELLED)?routerHistory.go(-info.delta,!1):info.type===NavigationType.pop&&isNavigationFailure(failure,ErrorTypes.NAVIGATION_ABORTED|ErrorTypes.NAVIGATION_DUPLICATED)&&routerHistory.go(-1,!1)),triggerAfterEach(toLocation,from,failure)}).catch(noop$1)})}let readyHandlers=useCallbacks(),errorListeners=useCallbacks(),ready;function triggerError(error,to,from){markAsReady(error);let list=errorListeners.list();return list.length?list.forEach(handler$1=>handler$1(error,to,from)):console.error(error),Promise.reject(error)}function isReady(){return ready&¤tRoute.value!==START_LOCATION_NORMALIZED?Promise.resolve():new Promise((resolve$1$1,reject)=>{readyHandlers.add([resolve$1$1,reject])})}function markAsReady(err){return ready||(ready=!err,setupListeners(),readyHandlers.list().forEach(([resolve$1$1,reject])=>err?reject(err):resolve$1$1()),readyHandlers.reset()),err}function handleScroll(to,from,isPush,isFirstNavigation){let{scrollBehavior}=options;if(!isBrowser||!scrollBehavior)return Promise.resolve();let scrollPosition=!isPush&&getSavedScrollPosition(getScrollKey(to.fullPath,0))||(isFirstNavigation||!isPush)&&history.state&&history.state.scroll||null;return nextTick().then(()=>scrollBehavior(to,from,scrollPosition)).then(position=>position&&scrollToPosition(position)).catch(err=>triggerError(err,to,from))}let go=delta=>routerHistory.go(delta),started,installedApps=new Set,router$1={currentRoute,listening:!0,addRoute,removeRoute,clearRoutes:matcher.clearRoutes,hasRoute,getRoutes,resolve:resolve$1,options,push,replace,go,back:()=>go(-1),forward:()=>go(1),beforeEach:beforeGuards.add,beforeResolve:beforeResolveGuards.add,afterEach:afterGuards.add,onError:errorListeners.add,isReady,install(app$1){app$1.component(`RouterLink`,RouterLink),app$1.component(`RouterView`,RouterView),app$1.config.globalProperties.$router=router$1,Object.defineProperty(app$1.config.globalProperties,`$route`,{enumerable:!0,get:()=>unref(currentRoute)}),isBrowser&&!started&¤tRoute.value===START_LOCATION_NORMALIZED&&(started=!0,push(routerHistory.location).catch(err=>{}));let reactiveRoute={};for(let key in START_LOCATION_NORMALIZED)Object.defineProperty(reactiveRoute,key,{get:()=>currentRoute.value[key],enumerable:!0});app$1.provide(routerKey,router$1),app$1.provide(routeLocationKey,shallowReactive(reactiveRoute)),app$1.provide(routerViewLocationKey,currentRoute);let unmountApp=app$1.unmount;installedApps.add(app$1),app$1.unmount=function(){installedApps.delete(app$1),installedApps.size<1&&(pendingLocation=START_LOCATION_NORMALIZED,removeHistoryListener&&removeHistoryListener(),removeHistoryListener=null,currentRoute.value=START_LOCATION_NORMALIZED,started=!1,ready=!1),unmountApp()}}};function runGuardQueue(guards){return guards.reduce((promise,guard)=>promise.then(()=>runWithContext(guard)),Promise.resolve())}return router$1}function useRouter(){return inject(routerKey)}function useRoute(_name){return inject(routeLocationKey)}function spawnUiApp(appName,appId,params,apps){let props=params?params.props:null,appKey=`${appName}${appId}`;apps.push({name:appName,appId,appKey,comp:appName,props,teleport:`#${appName+appId}`})}function destroyUiApp(appName,apps){let index=apps.findIndex(x=>x.name===appName);index>-1&&apps.splice(index,1)}function registerApps(app$1,componentsMap){Object.keys(componentsMap).forEach(key=>app$1.component(key,componentsMap[key]))}var _sfc_main$325={};function _sfc_render$5(_ctx,_cache){return null}var layoutEmpty_default=__plugin_vue_export_helper_default(_sfc_main$325,[[`render`,_sfc_render$5]]);const LAYOUT_ALIGNMENTS={left:`flex-start`,right:`flex-end`,center:`center`};var _sfc_main$324={},_hoisted_1$287={class:`layout-wrapper layout-safezones`},_hoisted_2$235={class:`layout-content`};function _sfc_render$4(_ctx,_cache,$props,$setup,$data,$options){return openBlock(),createElementBlock(`div`,_hoisted_1$287,[createBaseVNode(`div`,_hoisted_2$235,[renderSlot(_ctx.$slots,`default`,{},()=>[_cache[0]||=createTextVNode(`Content here`,-1)])])])}var layoutSingle_default=__plugin_vue_export_helper_default(_sfc_main$324,[[`render`,_sfc_render$4]]);const useEvents=(onDispose=onBeforeUnmount)=>{let bridge$4=useBridge(),events$3={_on:{},_once:{},on(name,func){name in events$3._on||(events$3._on[name]=[]),events$3._on[name].indexOf(func)===-1&&(bridge$4.events.on(name,func),events$3._on[name].push(func))},once(name,func){name in events$3._once||(events$3._once[name]=[]),events$3._once[name].indexOf(func)===-1&&(bridge$4.events.once(name,()=>{let idx=events$3._once[name].indexOf(func);idx>-1&&events$3._once[name].splice(idx,1)}),bridge$4.events.once(name,func),events$3._once[name].push(func))},off(name=void 0,func=void 0){if(!name){for(let name$1 in events$3._on){for(let func$1 of events$3._on[name$1])bridge$4.events.off(name$1,func$1);delete events$3._on[name$1]}return}if(name in events$3._on)if(func){let idx=events$3._on[name].indexOf(func);idx>-1&&(bridge$4.events.off(name,func),events$3._on[name].splice(idx,1)),events$3._on[name].length===0&&delete events$3._on[name]}else{for(let func$1 of events$3._on[name])bridge$4.events.off(name,func$1);delete events$3._on[name]}},emit(name,...values){bridge$4.events.emit(name,...values)}};return onDispose(()=>{for(let type of[`_on`,`_once`])for(let name in events$3[type]){for(let func of events$3[type][name])bridge$4.events.off(name,func);delete events$3[type][name]}}),events$3},useStreams=(names,callback,onDispose=onBeforeUnmount)=>{let bridge$4=useBridge(),enabled=!1,streams={on(){enabled||(enabled=!0,bridge$4.streams.add(names),bridge$4.events.on(`onStreamsUpdate`,callback))},off(){enabled&&(enabled=!1,bridge$4.streams.remove(names),bridge$4.events.off(`onStreamsUpdate`,callback))}};return streams.on(),onDispose(streams.off),streams};var hints_default=`ui.hints.quickSteerResponse,ui.hints.raceBrakesEffectiveness,ui.hints.quickCameraMovement,ui.hints.grabVehicleParts,ui.hints.funStabilityControl,ui.hints.recoverVehicle,ui.hints.oldCarsBurn,ui.hints.smokingWheels,ui.hints.carsBurnFuel,ui.hints.delicateCars,ui.hints.stabilityControlPresent,ui.hints.absWasOptional,ui.hints.installRollCage,ui.hints.spatialNavigation,ui.hints.repairHood,ui.hints.slowMotionPhysics,ui.hints.removeRearSeats,ui.hints.tuning,ui.hints.customLicensePlate,ui.hints.driveAtNight,ui.hints.moonGravity,ui.hints.unlockExtraFunctionality,ui.hints.playMultiseat,ui.hints.increaseGroundClearance,ui.hints.tiresBurstOnBumps,ui.hints.blueSmokeIsPistonDamage,ui.hints.keepTheEngineUpright,ui.hints.thermalDebugApp,ui.hints.rollPitchApps,ui.hints.cruiseControlApp,ui.hints.driveTheCanon,ui.hints.vehicleSkins,ui.hints.toggleMods,ui.hints.importveFramerate,ui.hints.photoModeMenu,ui.hints.publishScreenshots,ui.hints.towTrailer,ui.hints.brakesAndSteeringVary,ui.hints.countersteerEarly,ui.hints.startSlow,ui.hints.parkingbrakeForTurning,ui.hints.carefulWithOldSportsCars,ui.hints.corneringWithKeyboard,ui.hints.adaptToBadRoads,ui.hints.notAllCarsCanRace,ui.hints.changeBrakePads,ui.hints.useTurnSignals,ui.hints.showStandalonePcs,ui.hints.tweakFOV,ui.hints.driveWithMouse,ui.hints.liftOffOversteer,ui.hints.snapOversteer,ui.hints.slideBackWithParkingBrake,ui.hints.customizeSpecializedBindings,ui.hints.toggleFogLights,ui.hints.toggleLightBars,ui.hints.TrackIRSupported,ui.hints.chooseShiftingMode,ui.hints.saveRestoreVehicleHome,ui.hints.switchVehicle,ui.hints.coolantVaporizes,ui.hints.dontRunIntoTheCar`.split(`,`),_hoisted_1$286={key:0,class:`progress-box`},_hoisted_2$234={class:`progress-icon-group`},_hoisted_3$208={class:`progress-bar-container`},_hoisted_4$178={class:`progress-status`},_hoisted_5$153={class:`progress-history`},_hoisted_6$132={class:`custom-left-container`},_hoisted_7$118={key:0,class:`custom-text-panel`},_hoisted_8$99={key:1,class:`text`},_hoisted_9$89={key:1,class:`custom-indeterminate-panel`},_hoisted_10$77={class:`custom-right-container`},_hoisted_11$69={key:2,class:`tips-bar`},_hoisted_12$57={class:`tips-bar-title`},_hoisted_13$49={class:`tips-bar-tip`},_hoisted_14$44={key:0,class:`loading-cache`},_hoisted_15$42=[`src`],imagesAmount=18,activeRepeatTime=1e4,fadeInDefault=1e3,fadeOutDefault=2e3,_sfc_main$323={__name:`LoadingScreen`,setup(__props){useCssVars(_ctx=>({v79c091d8:fadeInTimeVar.value,v07559aed:fadeOutTimeVar.value}));let events$3=useEvents(),{lua}=useBridge(),navBlocker=useUINavBlocker(),lastImageNum=-1,repeatTimer=null,customTimer=null,iconsList=[{id:`terrain`,icon:icons.terrain},{id:`environment`,icon:icons.water},{id:`forest`,icon:icons.trafficCone},{id:`meshes`,icon:icons.garage01},{id:`roads`,icon:icons.road},{id:`beamng`,icon:icons.beamNG}],state=reactive({active:!1,visible:!1,fading:!1,shown:!1,autoActivate:!0,highSeas:!1,mode:`progress`,image:null,iconState:{},currentEntries:[],historyEntriesDisplay:[],customContent:null,fadeInTime:fadeInDefault,fadeOutTime:fadeOutDefault,customPause:-1});function resetState(){state.mode=`progress`,state.customContent=null,state.iconState={},state.currentEntries=[],state.historyEntriesDisplay=[],state.fadeInTime=fadeInDefault,state.fadeOutTime=fadeOutDefault,state.customPause=-1}let tip=ref(``),setTip=(txt=void 0,_retrying=!1)=>{let idx=~~(Math.random()*hints_default.length);tip.value=txt||hints_default[idx],(!tip.value||tip.value===`undefined`)&&(logger_default.debug(`Loading Screen tip is undefined!\nARG: ${JSON.stringify(txt)} TIP: ${JSON.stringify(tip.value)} IDX: ${idx}/${hints_default.length}`),_retrying?tip.value=``:setTip(void 0,!0))},fadeInTimeVar=computed(()=>state.fadeInTime+`ms`),fadeOutTimeVar=computed(()=>state.fadeOutTime+`ms`),progressValue=computed(()=>state.currentEntries[0]?.progress||0),currentStatus=computed(()=>state.currentEntries[0]?.message||``);events$3.on(`LoadingScreen`,data=>{if(window.beamng?.ingame){if((!data||typeof data!=`object`)&&(data={}),state.autoActivate=!1,state.active=!!data.active,data.custom&&(state.mode=`custom`,state.fadeInTime=data.custom.fadeIn>0?data.custom.fadeIn*1e3:state.fadeInTime||0,state.fadeOutTime=data.custom.fadeOut>0?data.custom.fadeOut*1e3:state.fadeOutTime||0),state.active)data.custom?(state.customPause=data.custom.pause?data.custom.pause*1e3:-1,state.customContent=data.custom.data,state.customContent?.image&&(state.image=state.customContent.image)):(resetState(),window.bngVue.gotoAngularState(`blank`)),setTip(state.customContent?.tips);else if(state.mode===`progress`&&`gotoMainMenu`in data){let args=[];data.gotoMainMenu?args.push(`menu.mainmenu`):args.push(`menu`,[`loading`]),window.globalAngularRootScope?.$broadcast(`ChangeState`,...args),window.vueEventBus?.emit(`onChangeState`,...args)}}}),events$3.on(`UpdateLoadingProgressV2`,data=>{if(!window.beamng?.ingame||!state.autoActivate&&!state.active)return;let{currentEntries,historyEntries}=data;(!currentEntries||!Array.isArray(currentEntries))&&(currentEntries=[]),(!historyEntries||!Array.isArray(historyEntries))&&(historyEntries=[]),state.currentEntries=currentEntries,state.historyEntriesDisplay=historyEntries.slice(Math.max(historyEntries.length-3,1)),state.iconState={};for(let{name,progress}of currentEntries)state.iconState[name.toLowerCase()]=progress;for(let{name}of historyEntries)state.iconState[name.toLowerCase()]=100;state.autoActivate&&(state.active=currentEntries.length>0||historyEntries.length>0)});let onFadeIn=()=>{state.fading=!1,state.mode===`progress`?(lua.core_gamestate.loadingScreenActive(),repeatTimer=setTimeout(()=>{lua.core_gamestate.loadingScreenActive()},activeRepeatTime)):state.mode===`custom`&&(lua.extensions.ui_fadeScreen.onScreenFadeStateDelayed(1),state.customPause!==-1&&(customTimer=setTimeout(()=>{lua.extensions.ui_fadeScreen.onScreenFadeStateDelayed(2)},state.customPause*1e3)))},onFadeOut=()=>{state.fading=!1,state.shown=!1,state.mode===`custom`&&lua.extensions.ui_fadeScreen.onScreenFadeStateDelayed(3),resetState(),loadNextImage()};watch(()=>state.active,(newActive,oldActive)=>{window.beamng?.ingame&&(newActive&&!oldActive?activateLoading():!newActive&&oldActive&&deactivateLoading())});let activateLoading=()=>{state.active&&(deactivateLoading.cancel(),navBlocker.allowOnly([]),nextTick(()=>{state.visible=!0,state.fading=!0,state.shown=!0}))},deactivateLoading=debounce(()=>{state.active||(clearTimers(),navBlocker.clear(),nextTick(()=>{state.visible=!1,state.fading=!0}))},100),getRandomImageNum=()=>{let rnd=~~(Math.random()*imagesAmount)+1;return rnd===lastImageNum?getRandomImageNum():(lastImageNum=rnd,rnd)},getNextImageUrl=()=>{let url;return url=state.highSeas?`images/mainmenu/unofficial_version.jpg`:`images/loading/drive/${getRandomImageNum()}.jpg`,getAssetURL(url)},loadNextImage=async()=>{let url=getNextImageUrl();state.image!==url&&(await loadImage$1(url),state.image=url)},loadImage$1=url=>new Promise((resolve$1,reject)=>{let img=new Image;img.onload=()=>resolve$1(url),img.onerror=()=>reject(url),img.src=url}),clearTimers=()=>{repeatTimer&&=(clearTimeout(repeatTimer),null),customTimer&&=(clearTimeout(customTimer),null)},initLoadingScreen=()=>bngApi.engineLua(`sailingTheHighSeas`,async ahoy=>{state.highSeas=ahoy===!0,await loadNextImage(),setTip(),lua.core_gamestate.loadingScreenActive(),window.loadingTest=active=>{events$3.emit(`LoadingScreen`,{active})}});return onMounted(()=>{linkLoadingScreenState(state),initLoadingScreen()}),onUnmounted(()=>clearTimers()),(_ctx,_cache)=>(openBlock(),createElementBlock(Fragment,null,[createVNode(Transition,{name:`loading-fade`,onAfterEnter:onFadeIn,onAfterLeave:onFadeOut},{default:withCtx(()=>[state.visible?(openBlock(),createElementBlock(`dialog`,{key:0,open:``,class:normalizeClass([`loading-screen`,`loading-screen-${state.mode}`])},[createBaseVNode(`div`,{class:`loading-background`,style:normalizeStyle({backgroundImage:state.image?`url('${state.image}')`:`none`})},null,4),state.mode===`progress`?(openBlock(),createElementBlock(`div`,_hoisted_1$286,[createBaseVNode(`div`,_hoisted_2$234,[(openBlock(),createElementBlock(Fragment,null,renderList(iconsList,iconInfo=>createBaseVNode(`div`,{key:iconInfo.id,class:`progress-icon-box`,style:normalizeStyle({backgroundPosition:`0 ${state.iconState[iconInfo.id]||0}%`})},[createVNode(unref(bngIcon_default),{type:iconInfo.icon,color:`#fff`,class:`progress-icon`},null,8,[`type`])],4)),64))]),createBaseVNode(`div`,_hoisted_3$208,[createVNode(unref(bngProgressBar_default),{class:`progress-bar`,gradient:``,"show-value-label":!1,min:0,max:100,value:progressValue.value},null,8,[`value`])]),createBaseVNode(`div`,_hoisted_4$178,toDisplayString(currentStatus.value||_ctx.$tt(`ui.common.loading`)),1),createBaseVNode(`div`,_hoisted_5$153,[(openBlock(!0),createElementBlock(Fragment,null,renderList(state.historyEntriesDisplay,(item,idx)=>(openBlock(),createElementBlock(`div`,{key:idx},toDisplayString(item.message),1))),128))])])):createCommentVNode(``,!0),state.mode===`custom`?(openBlock(),createElementBlock(`div`,{key:1,class:normalizeClass([`custom-box`,{"custom-with-tips":state.customContent?.tips}])},[createBaseVNode(`div`,_hoisted_6$132,[state.customContent&&(state.customContent.title||state.customContent.text)?(openBlock(),createElementBlock(`div`,_hoisted_7$118,[state.customContent.title?(openBlock(),createBlock(unref(bngScreenHeading_default),{key:0,preheadings:[_ctx.$tt(state.customContent.subtitle)]},{default:withCtx(()=>[createTextVNode(toDisplayString(_ctx.$tt(state.customContent.title)),1)]),_:1},8,[`preheadings`])):createCommentVNode(``,!0),state.customContent.text?(openBlock(),createElementBlock(`p`,_hoisted_8$99,[createVNode(unref(dynamicComponent_default),{"translate-id":state.customContent.text,bbcode:``,"translate-context":``},null,8,[`translate-id`])])):createCommentVNode(``,!0)])):(openBlock(),createElementBlock(`div`,_hoisted_9$89,[createVNode(unref(bngScreenHeading_default),null,{default:withCtx(()=>[createTextVNode(toDisplayString(_ctx.$tt(`ui.common.loading.short`)),1)]),_:1}),createVNode(unref(bngProgressBar_default),{class:`progress-bar`,gradient:``,"show-value-label":!1,min:0,max:100,indeterminate:``})]))]),createBaseVNode(`div`,_hoisted_10$77,[state.customContent&&state.customContent.image?(openBlock(),createElementBlock(`div`,{key:0,class:`custom-image-panel`,style:normalizeStyle({backgroundImage:`url('${state.customContent.image}')`})},null,4)):createCommentVNode(``,!0)])],2)):createCommentVNode(``,!0),state.mode===`progress`||state.customContent?.tips?(openBlock(),createElementBlock(`div`,_hoisted_11$69,[createBaseVNode(`div`,_hoisted_12$57,toDisplayString(_ctx.$tt(`ui.loadingScreen.tips`))+`:`,1),createBaseVNode(`div`,_hoisted_13$49,[createVNode(unref(dynamicComponent_default),{"translate-id":tip.value,bbcode:``},null,8,[`translate-id`])])])):createCommentVNode(``,!0)],2)):createCommentVNode(``,!0)]),_:1}),state.image?(openBlock(),createElementBlock(`div`,_hoisted_14$44,[createBaseVNode(`img`,{src:state.image,alt:``},null,8,_hoisted_15$42)])):createCommentVNode(``,!0)],64))}},LoadingScreen_default=__plugin_vue_export_helper_default(_sfc_main$323,[[`__scopeId`,`data-v-2f135df0`]]),_hoisted_1$285={class:`pause-button-wrapper`},_sfc_main$322={__name:`pauseButton`,props:{teleportTo:[String,Object]},setup(__props){let route=useRoute(),events$3=useEvents(),gameContext=useGameContextStore(),isGamePaused=ref(!1),physicsMaybePaused=ref(!1),replayActive=ref(!1),replayPaused=ref(!1);events$3.on(`physicsStateChanged`,state=>{physicsMaybePaused.value=!state}),events$3.on(`replayStateChanged`,core_replay=>{replayActive.value=core_replay.state===`playback`,replayPaused.value=replayActive.value&&core_replay.paused}),events$3.on(`simTimeAuthority.pauseStateChanged`,data=>{isGamePaused.value=data.paused});let isInMenu=computed(()=>route.name?.startsWith(`menu`)&&!gameContext.activities?.length&&sysInfo_default.gameState.value!==void 0&&sysInfo_default.gameState.value!==`loading`),isPhysicsPaused=computed(()=>physicsMaybePaused.value),isReplayPaused=computed(()=>replayActive.value&&replayPaused.value),showPauseButton=computed(()=>isInMenu.value||isPhysicsPaused.value||isReplayPaused.value),isPaused=computed(()=>isGamePaused.value||isPhysicsPaused.value||isReplayPaused.value),buttonState=computed(()=>isInMenu.value&&isPaused.value?`menu-paused`:isInMenu.value?`menu`:isPaused.value?`paused`:`default`),togglePause=()=>{Lua_default.simTimeAuthority.togglePause()};return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$285,[(openBlock(),createBlock(Teleport,{disabled:!__props.teleportTo,to:__props.teleportTo},[withDirectives((openBlock(),createBlock(unref(bngButton_default),{class:normalizeClass([`pause-button`,buttonState.value]),accent:unref(ACCENTS).custom,"no-sound":``,onClick:togglePause,"bng-no-nav":``},{default:withCtx(()=>[createVNode(unref(bngBinding_default),{class:`pause-button-binding-bg`,action:`pause`}),createVNode(unref(bngIcon_default),{class:`pause-button-icon`,type:isPaused.value?unref(icons).pause:unref(icons).play},null,8,[`type`])]),_:1},8,[`class`,`accent`])),[[vShow,showPauseButton.value],[unref(BngTooltip_default),_ctx.$tt(`ui.inputActions.general.pause.title`),void 0,{bottom:!0}]])],8,[`disabled`,`to`]))]))}},pauseButton_default=__plugin_vue_export_helper_default(_sfc_main$322,[[`__scopeId`,`data-v-ea9a26b4`]]),UIAppStorage,setupDone;const useUIApps=()=>(setupDone||setup(),service);var setup=()=>{UIAppStorage||=window.UIAppStorage,setupDone=!!UIAppStorage},setLayout=layoutName=>{layoutName==`blank`?_broadcast(`appContainer:clear`):_broadcast(`appContainer:loadLayoutByType`,layoutName)},setVisible=state=>{_broadcast(`ShowApps`,!!state)},service={setLayout,setVisible,get currentLayout(){return UIAppStorage.currentLayout}},_broadcast=(...params)=>{window.globalAngularRootScope&&window.globalAngularRootScope.$broadcast(...params)},_sfc_main$321={};function _sfc_render$3(_ctx,_cache){return openBlock(),createElementBlock(`span`)}var NotFound_default=__plugin_vue_export_helper_default(_sfc_main$321,[[`render`,_sfc_render$3]]);function useGridSelector(backendName=`gridSelector`,defaultPath={keys:[`missions`]},defaultDetailsMode=`detail`){let currentPath=ref(defaultPath),previousPath=ref(null),groups=ref([]),filterList=ref([]),filterByProp=ref([]),commonFilters=ref([]),lockedFiltersByProp=ref([]),activeFilters=ref([]),onlyCommonFilters=ref(!0),detailsMode=ref(defaultDetailsMode),selectedItem=ref(null),selectedItemDetails=ref(null),prevSelectedItem=ref(null),previewItem=ref(null),previewItemDetails=ref(null),managementDetails=ref(null),autoFocusKey=ref(null),showScreenHeader=ref(!0),screenHeaderTitle=ref(`Grid Selector`),screenHeaderPath=ref([{text:`Menu`,gotoAngularState:`menu`}]),{events:events$3}=useBridge(),backFromDetailsCallback=null,refreshAllHandler=backendName$1=>{backendName$1===backendName$1&&(logger_default.debug(`gridSelectorRefreshAll`),loadTiles(),loadFilters(),loadManagementDetails())},refreshCurrentItemDetailsHandler=backendName$1=>{backendName$1===backendName$1&&(logger_default.debug(`gridSelectorRefreshCurrentItemDetails`),setSelectedItem(selectedItem.value))};events$3.on(`gridSelectorRefreshAll`,refreshAllHandler),events$3.on(`gridSelectorRefreshCurrentItemDetails`,refreshCurrentItemDetailsHandler);let log=(...args)=>{},displayData=ref([]),searchText$1=ref(``);async function getSearchText(){try{let data=await Lua_default.ui_gridSelector.getSearchText(backendName);return searchText$1.value=data||``,data||``}catch(error){return logger_default.error(`Failed to get search text:`,error),``}}async function setSearchText(value){try{await Lua_default.ui_gridSelector.setSearchText(backendName,value),searchText$1.value=value||``,await loadTiles(),await loadFilters(),await updateScreenHeaderData()}catch(error){logger_default.error(`Failed to set search text:`,error)}}let isInitializing=ref(!1),safeArray=arr=>Array.isArray(arr)?arr:[];async function setCurrentPath(path){currentPath.value=path,await loadTiles()}async function loadTiles(){currentPath.value;try{let data=await Lua_default.ui_gridSelector.getTiles(backendName,currentPath.value,previousPath.value!==currentPath.value);if(Lua_default.ui_gridSelector.profilerFinish(backendName,`received lua data on UI`),groups.value=safeArray(data),groups.value,!selectedItem.value&&(detailsMode.value===`advanced`||detailsMode.value===`detail`)&&previousPath.value!==currentPath.value)for(let group of groups.value)for(let tile of group.tiles)tile.isDefaultSelected&&(autoFocusKey.value=tile.key,tile.name,tile.forceAutoFocus&&backFromDetailsCallback());previousPath.value=currentPath.value,Lua_default.ui_gridSelector.profilerFinish(backendName,`loaded tiles into reactive state`)}catch(error){logger_default.error(`Failed to load tiles:`,error)}}async function loadFilters(){try{let data=await Lua_default.ui_gridSelector.getFilters(backendName);filterList.value=safeArray(data.filterList),filterByProp.value=data.filterByProp,commonFilters.value=safeArray(data.commonFilters)||[],lockedFiltersByProp.value=data.lockedFiltersByProp||[],activeFilters.value=safeArray(data.activeFilters),onlyCommonFilters.value=data.onlyCommonFilters,filterList.value,filterByProp.value,activeFilters.value,onlyCommonFilters.value}catch(error){logger_default.error(`Failed to load filters:`,error)}}async function loadManagementDetails(){try{managementDetails.value=await Lua_default.ui_gridSelector.getManagementDetails(backendName),managementDetails.value}catch(error){logger_default.error(`Failed to load management details:`,error)}}async function toggleFilter(propName,option){try{await Lua_default.ui_gridSelector.toggleFilter(backendName,propName,option),await loadFilters(),await loadTiles(),await updateScreenHeaderData()}catch(error){logger_default.error(`Failed to toggle filter:`,error)}}async function updateRangeFilter(propName,min$1,max$1){try{await Lua_default.ui_gridSelector.updateRangeFilter(backendName,propName,min$1,max$1),await loadFilters(),await loadTiles(),await updateScreenHeaderData()}catch(error){logger_default.error(`Failed to update range filter:`,error)}}async function resetRangeFilter(propName){console.log(`Resetting range filter:`,propName);try{await Lua_default.ui_gridSelector.resetRangeFilter(backendName,propName),await loadFilters(),await loadTiles(),await updateScreenHeaderData()}catch(error){logger_default.error(`Failed to reset range filter:`,error)}}async function resetSetFilter(propName){try{await Lua_default.ui_gridSelector.resetSetFilter(backendName,propName),await loadFilters(),await loadTiles(),await updateScreenHeaderData()}catch(error){logger_default.error(`Failed to reset set filter:`,error)}}async function loadDisplayData(){try{displayData.value=safeArray(await Lua_default.ui_gridSelector.getDisplayDataOptions(backendName));let searchOption=displayData.value.find(option=>option.key===`searchText`);searchOption&&(searchText$1.value=searchOption.value||``),displayData.value}catch(error){logger_default.error(`Failed to load display data:`,error)}}async function updateDisplayData(key,value){try{await Lua_default.ui_gridSelector.setDisplayDataOption(backendName,key,value),await loadDisplayData(),await loadTiles(),await updateScreenHeaderData()}catch(error){logger_default.error(`Failed to update display data:`,error)}}async function resetDisplayDataToDefaults(){try{await Lua_default.ui_gridSelector.resetDisplayDataToDefaults(backendName),await loadDisplayData(),await loadTiles(),await updateScreenHeaderData()}catch(error){logger_default.error(`Failed to reset display data to defaults:`,error)}}function setDetailsMode(mode){detailsMode.value=mode}async function setSelectedItem(item){if(!item||!item.showDetails){autoFocusKey.value=null,selectedItem.value=null,selectedItemDetails.value=null,await loadManagementDetails();return}try{item.showDetails;let details=await Lua_default.ui_gridSelector.getDetails(backendName,item.showDetails);autoFocusKey.value=item.key,selectedItem.value=item,selectedItemDetails.value=details,details?.paintData&&details?.paints&&selectedItemDetails.value?.paints&&(selectedItemDetails.value.paints.multiPaintSetups=safeArray(selectedItemDetails.value.paints.multiPaintSetups),selectedItemDetails.value.paints.factoryPaints=safeArray(selectedItemDetails.value.paints.factoryPaints)),setDetailsMode(`detail`)}catch(error){logger_default.error(`Failed to get item details:`,error),autoFocusKey.value=null,selectedItem.value=item,selectedItemDetails.value=null}}async function clearSelectedItem(){selectedItem.value=null,selectedItemDetails.value=null,await loadManagementDetails()}async function setPreviewItem(item){if(!item||!item.showDetails){previewItem.value=null,previewItemDetails.value=null;return}try{let details=await Lua_default.ui_gridSelector.getDetails(backendName,item.showDetails);previewItem.value=item,previewItemDetails.value=details,setDetailsMode(`detail`)}catch{previewItem.value=item,previewItemDetails.value=null}}function clearPreviewItem(){previewItem.value=null,previewItemDetails.value=null}let activeItem=computed(()=>selectedItem.value||previewItem.value),activeItemDetails=computed(()=>selectedItem.value?selectedItemDetails.value:previewItemDetails.value);async function executeButton(buttonId,additionalData){try{if(additionalData?.waitForLoadingScreen)window.vueEventBus?.emit(`LoadingScreen`,{active:!0}),await startLoading(async()=>{await waitForLoadingScreenFadeIn();let data=await Lua_default.ui_gridSelector.executeButton(backendName,buttonId,additionalData);data&&data.gotoPath&&setCurrentPath(data.gotoPath)});else{let data=await Lua_default.ui_gridSelector.executeButton(backendName,buttonId,additionalData);data&&data.gotoPath&&setCurrentPath(data.gotoPath)}}catch(error){logger_default.error(`Failed to execute button:`,error)}}let executeButtonHandler=(backendName$1,buttonId,additionalData)=>{backendName$1===backendName$1&&executeButton(buttonId,additionalData)};events$3.on(`gridSelectorExecuteButton`,executeButtonHandler);async function toggleFavourite(item){await Lua_default.ui_gridSelector.toggleFavourite(backendName,item.showDetails);let details=await Lua_default.ui_gridSelector.getDetails(backendName,item.showDetails);selectedItem.value=item,selectedItemDetails.value=details,await loadTiles()}function clearSearch(){setSearchText(``)}function updateSearch(newSearchText){setSearchText(newSearchText||``)}function commitSearch(){setSearchText(searchText$1.value||``)}function isFilterLocked(propName,option=null){return lockedFiltersByProp.value[propName]?option?lockedFiltersByProp.value[propName][option]!==void 0:Object.keys(lockedFiltersByProp.value[propName]).length>0:!1}async function updateScreenHeaderData(){try{let headerData=await Lua_default.ui_gridSelector.getScreenHeaderTitleAndPath(backendName,currentPath.value);screenHeaderTitle.value=headerData.title||`Grid Selector`,screenHeaderPath.value=headerData.pathSegments}catch(error){logger_default.error(`Failed to update screen header title:`,error),screenHeaderTitle.value=`Grid Selector`,screenHeaderPath.value=[{text:`Menu`,gotoAngularState:`menu`}]}}function isFilterOptionLocked(propName,option){return isFilterLocked(propName,option)}function isRangeFilterLocked(propName){return isFilterLocked(propName)}watch(currentPath,()=>{clearSelectedItem(),clearPreviewItem(),updateScreenHeaderData()}),watch([filterByProp,activeFilters],()=>{clearSelectedItem(),clearPreviewItem(),updateScreenHeaderData()}),watch(displayData,()=>{updateScreenHeaderData()},{deep:!0});function notifyUIReady(tag){Lua_default.ui_gridSelector.profilerFinish(backendName,tag)}function setOnBackFromDetailsCallback(callback){backFromDetailsCallback=callback}async function initialize(){if(!isInitializing.value)try{isInitializing.value=!0,await Promise.all([loadFilters(),loadDisplayData(),loadManagementDetails(),getSearchText()])}catch(error){logger_default.error(`Failed to initialize GridSelector composable:`,error)}finally{isInitializing.value=!1}}return onUnmounted(()=>{logger_default.debug(`GridSelector composable unmounting`),events$3.off(`gridSelectorRefreshAll`,refreshAllHandler),events$3.off(`gridSelectorRefreshCurrentItemDetails`,refreshCurrentItemDetailsHandler),events$3.off(`gridSelectorExecuteButton`,executeButtonHandler)}),{groups,filterList,filterByProp,lockedFiltersByProp,commonFilters,activeFilters,onlyCommonFilters,displayData,currentPath,detailsMode,selectedItem,selectedItemDetails,prevSelectedItem,previewItem,previewItemDetails,activeItem,activeItemDetails,managementDetails,isInitializing,searchText:searchText$1,getSearchText,setSearchText,autoFocusKey,showScreenHeader,screenHeaderTitle,screenHeaderPath,initialize,setCurrentPath,loadTiles,loadFilters,loadManagementDetails,toggleFilter,updateRangeFilter,resetRangeFilter,resetSetFilter,loadDisplayData,updateDisplayData,resetDisplayDataToDefaults,setDetailsMode,setSelectedItem,clearSelectedItem,setPreviewItem,clearPreviewItem,executeButton,notifyUIReady,isFilterLocked,isFilterOptionLocked,isRangeFilterLocked,toggleFavourite,clearSearch,updateSearch,commitSearch,updateScreenHeaderData,exploreFolder:function(path){Lua_default.ui_gridSelector.exploreFolder(backendName,path)},goToMod:function(modId){Lua_default.ui_gridSelector.goToMod(backendName,modId)},setOnBackFromDetailsCallback}}var _hoisted_1$284=[`bng-scoped-nav-autofocus`],_hoisted_2$233={class:`image-container`},_hoisted_3$207={key:0,class:`sub-element-count-badge`},_hoisted_4$177={class:`item-label`},_hoisted_5$152={class:`item-name`},_hoisted_6$131={class:`icons-container`},_hoisted_7$117=[`src`],_hoisted_8$98={key:0,class:`sub-element-count-badge`},_hoisted_9$88={key:1},sizes={tiny:{width:7.5,margin:.5,fontSize:.8},small:{width:9.5,margin:.5,fontSize:1},medium:{width:12,margin:.5,fontSize:1},large:{width:16,margin:.5,fontSize:1},huge:{width:20,margin:.5,fontSize:1.5},list:{width:22,height:3,margin:.5,fontSize:.9}},thumbAspectRatio=16/9.5,captionHeightEm=2,getSizeCalc=displaySize=>ctx=>{let size$3=sizes[displaySize]||sizes.medium;if(displaySize===`list`)return{width:size$3.width,height:size$3.height,margin:size$3.margin};let height$1=size$3.width/thumbAspectRatio+size$3.fontSize*captionHeightEm-size$3.margin*2;return{width:size$3.width,height:height$1,margin:size$3.margin}},__default__$6={getSizeCalc},_sfc_main$320=Object.assign(__default__$6,{__name:`Tile`,props:{tile:{type:Object,required:!0},isFavourite:Boolean,isConfig:Boolean,displaySize:String,tileImagesTopAligned:{type:Boolean,default:!1}},emits:[`focus`,`blur`,`click`,`dblclick`],setup(__props,{expose:__expose,emit:__emit}){let{showIfController}=storeToRefs(controls_default()),props=__props,gridSelectionState=inject(`gridSelectionState`,null),state=computed(()=>{let res={selected:!1,dimmed:!1,isAutoFocused:!1};return gridSelectionState&&gridSelectionState.value&&(res.selected=gridSelectionState.value.inDetails&&gridSelectionState.value.activeItemKey===props.tile.key,res.dimmed=showIfController.value&&gridSelectionState.value.inDetails&&gridSelectionState.value.activeItemKey!==props.tile.key,res.isAutoFocused=gridSelectionState.value.autoFocusKey===props.tile.key),res}),emit$1=__emit,elTile=ref(null);__expose({getElement:()=>elTile.value});let isListItem=computed(()=>props.displaySize===`list`);function onClick(){emit$1(`click`)}function onFocus(){emit$1(`focus`)}function onBlur(){emit$1(`blur`)}return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,{class:normalizeClass([`tile-wrapper`,`tile-size-${__props.displaySize}`]),style:normalizeStyle({"--tile-font-size":sizes[__props.displaySize].fontSize+`em`})},[_cache[0]||=createBaseVNode(`div`,{class:`tile-bg`},null,-1),withDirectives((openBlock(),createElementBlock(`div`,{ref_key:`elTile`,ref:elTile,"bng-scoped-nav-autofocus":state.value.isAutoFocused,class:normalizeClass({tile:!0,selected:state.value.selected,dimmed:state.value.dimmed,auxiliary:__props.tile.isAuxiliary,"is-career-only":__props.tile.isCareerOnly}),onClick:withModifiers(onClick,[`stop`]),onFocus,onBlur,"bng-nav-item":``},[createBaseVNode(`div`,_hoisted_2$233,[createVNode(unref(bngImage_default),{class:normalizeClass([`item-image`,{"top-aligned":__props.tileImagesTopAligned}]),src:__props.tile.preview},null,8,[`class`,`src`]),isListItem.value?createCommentVNode(``,!0):(openBlock(),createElementBlock(Fragment,{key:0},[!__props.isConfig&&__props.tile.subElementCount>=1?(openBlock(),createElementBlock(`div`,_hoisted_3$207,toDisplayString(__props.tile.subElementCount),1)):createCommentVNode(``,!0),__props.isFavourite||__props.tile.showFavouriteIconPercent>=1?(openBlock(),createBlock(unref(bngIcon_default),{key:1,class:`favorite-indicator`,type:`star`})):createCommentVNode(``,!0)],64))]),createBaseVNode(`div`,_hoisted_4$177,[createBaseVNode(`span`,_hoisted_5$152,toDisplayString(__props.tile.name),1),createBaseVNode(`div`,_hoisted_6$131,[__props.tile.sourceIcons?(openBlock(!0),createElementBlock(Fragment,{key:0},renderList(__props.tile.sourceIcons,sourceIcon=>(openBlock(),createElementBlock(Fragment,{key:sourceIcon},[sourceIcon.icon?(openBlock(),createBlock(unref(bngIcon_default),{key:0,type:sourceIcon.icon,class:`source-icon`,color:`var(--bng-cool-gray-100)`},null,8,[`type`])):createCommentVNode(``,!0),sourceIcon.svg?(openBlock(),createElementBlock(`img`,{key:1,class:`svg-icon`,src:sourceIcon.svg,alt:``},null,8,_hoisted_7$117)):createCommentVNode(``,!0)],64))),128)):createCommentVNode(``,!0),isListItem.value&&__props.tile.showFavouriteIconPercent>0?(openBlock(),createBlock(unref(bngIcon_default),{key:1,class:`favorite-indicator`,type:__props.tile.showFavouriteIconPercent>=1?`star`:`starSecondary`},null,8,[`type`])):createCommentVNode(``,!0)]),isListItem.value&&!__props.isConfig&&__props.tile.subElementCount>=1?(openBlock(),createElementBlock(`span`,_hoisted_8$98,toDisplayString(__props.tile.subElementCount),1)):isListItem.value?(openBlock(),createElementBlock(`span`,_hoisted_9$88)):createCommentVNode(``,!0)])],42,_hoisted_1$284)),[[unref(BngOnUiNav_default),void 0,`ok`,{focusRequired:!0,asMouse:!0,bubble:!0}],[unref(BngSoundClass_default),`bng_click_hover_generic`],[unref(BngDoubleClick_default),__props.tile.doubleClickDetails?()=>emit$1(`dblclick`):null,__props.tile.doubleClickMode]])],6))}}),Tile_default=__plugin_vue_export_helper_default(_sfc_main$320,[[`__scopeId`,`data-v-51fd3377`]]),_hoisted_1$283={class:`group-header`,"bng-list-title":``},_sfc_main$319={__name:`GroupHeader`,props:{label:{type:String,required:!0}},setup(__props){return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$283,[createVNode(bngCardHeading_default,{class:`header-label`},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.label),1)]),_:1}),_cache[0]||=createBaseVNode(`div`,{class:`header-line`},null,-1)]))}},GroupHeader_default=__plugin_vue_export_helper_default(_sfc_main$319,[[`__scopeId`,`data-v-28596ef8`]]),_sfc_main$318={__name:`Grid`,props:{autoFocusKey:{type:String,default:null},activeItem:{type:Object,default:null},groups:{type:Array,required:!0},isConfig:{type:Boolean,default:!1},displaySize:{type:String,default:`medium`,validator:value=>[`tiny`,`small`,`medium`,`large`,`huge`,`list`].includes(value)},inDetails:{type:Boolean,default:!1},backendName:{type:String,default:`gridSelector`},tileImagesTopAligned:{type:Boolean,default:!1},doubleClickOverride:{type:Function,default:null}},emits:[`select-item`,`deselect-item`,`focus-item`],setup(__props,{emit:__emit}){let{showIfController}=storeToRefs(controls_default()),props=__props,emit$1=__emit,gridListRef=ref(),containerWidth=ref(0),baseFontSize=ref(16),tileSizeCalc=ctx=>Tile_default.getSizeCalc(props.displaySize)(ctx),maxTilesPerRow=computed(()=>{if(!containerWidth.value)return 1/0;let size$3=Tile_default.getSizeCalc(props.displaySize)({}),tileWidthPx=(size$3.width+size$3.margin)*baseFontSize.value;return(Math.floor(containerWidth.value/tileWidthPx)||1)*(props.displaySize===`list`?2:1)}),limitedGroups=computed(()=>props.groups.map(group=>({...group,tiles:group.isRecentGroup?group.tiles.slice(0,maxTilesPerRow.value):group.tiles}))),updateContainerWidth=()=>{gridListRef.value?.$el&&(containerWidth.value=gridListRef.value.$el.clientWidth,baseFontSize.value=parseFloat(getComputedStyle(document.documentElement).fontSize)||16)},resizeObserver;onMounted(()=>{updateContainerWidth(),gridListRef.value?.$el&&(resizeObserver=new ResizeObserver(debounce(updateContainerWidth,100)),resizeObserver.observe(gridListRef.value.$el))}),onUnmounted(()=>{resizeObserver&&resizeObserver.disconnect()}),provide(`gridSelectionState`,computed(()=>({inDetails:props.inDetails,activeItemKey:props.activeItem?.key||null,autoFocusKey:props.autoFocusKey})));let focusItem=tile=>{props.inDetails||(showIfController.value&&preselectItem(tile),emit$1(`focus-item`,tile))},selectItem=tile=>{preselectItem.cancel(),emit$1(`select-item`,tile)},preselectItem=debounce(tile=>emit$1(`select-item`,tile,!1),200),handleDoubleClick=async item=>{if(console.log(`handleDoubleClick`,item),item.doubleClickDetails)try{props.doubleClickOverride?props.doubleClickOverride(item):await Lua_default.ui_gridSelector.executeDoubleClick(props.backendName,item.doubleClickDetails)}catch(error){console.error(`Failed to execute double click:`,error)}};return(_ctx,_cache)=>(openBlock(),createBlock(unref(bngList_default),{ref_key:`gridListRef`,ref:gridListRef,class:`grid-list`,layout:unref(LIST_LAYOUTS).TILES,"no-background":``,big:``,immediate:``,"keep-alive":500,"title-width":20,"title-height":1.5,"title-margin":.5,"tile-size-calc":tileSizeCalc},{default:withCtx(()=>[(openBlock(!0),createElementBlock(Fragment,null,renderList(limitedGroups.value,group=>(openBlock(),createElementBlock(Fragment,{key:group.label},[group.label?(openBlock(),createBlock(GroupHeader_default,{key:0,label:group.label,"bng-list-title":``},null,8,[`label`])):createCommentVNode(``,!0),(openBlock(!0),createElementBlock(Fragment,null,renderList(group.tiles,tile=>(openBlock(),createBlock(Tile_default,{key:tile.key,tile,"is-config":__props.isConfig,"display-size":__props.displaySize,"is-favourite":group.label===`Favourites`,"tile-images-top-aligned":__props.tileImagesTopAligned,onFocus:$event=>focusItem(tile),onClick:$event=>selectItem(tile),onDblclick:$event=>handleDoubleClick(tile)},null,8,[`tile`,`is-config`,`display-size`,`is-favourite`,`tile-images-top-aligned`,`onFocus`,`onClick`,`onDblclick`]))),128))],64))),128))]),_:1},8,[`layout`]))}},Grid_default$1=__plugin_vue_export_helper_default(_sfc_main$318,[[`__scopeId`,`data-v-efa73a51`]]),_hoisted_1$282={class:`display-controls-container`},_hoisted_2$232={class:`control-group-label`},_hoisted_3$206={key:0,class:`reset-button-container`},_sfc_main$317={__name:`DisplayControls`,props:{displayData:{type:Array,required:!0},detailsMode:{type:String,required:!0},updateDisplayData:{type:Function,required:!0},resetDisplayDataToDefaults:{type:Function,required:!0},setDetailsMode:{type:Function,required:!0}},emits:[`focus-item`],setup(__props,{emit:__emit}){let props=__props,emit$1=__emit,booleanToStringByKey=computed(()=>{let valuesByKey={};for(let option of props.displayData)if(option.type===`checkbox`){valuesByKey[option.key]={};for(let checkboxOption of option.options)valuesByKey[option.key][checkboxOption.value]=checkboxOption.label||(checkboxOption.value?`Yes`:`No`)}return valuesByKey}),controls$1=computed(()=>props.displayData.filter(x=>x.showInModes?.[props.detailsMode]).map(x=>({...x,checkboxLabel:x.type===`checkbox`?booleanToStringByKey.value[x.key]?.[x.value]:void 0}))),onOptionChanged=(key,newValue)=>{props.updateDisplayData(key,newValue),emit$1(`focus-item`,key)},resetToDefaults=()=>{props.resetDisplayDataToDefaults()};return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$282,[createBaseVNode(`div`,{class:normalizeClass([`display-controls`,{"display-controls-list":__props.detailsMode===`displayControls`||__props.detailsMode===`default`}])},[(openBlock(!0),createElementBlock(Fragment,null,renderList(controls$1.value,option=>(openBlock(),createElementBlock(`div`,{key:option.key,class:normalizeClass([`control-group`,{"force-full-width":__props.detailsMode===`default`}])},[createBaseVNode(`div`,_hoisted_2$232,toDisplayString(option.label),1),createVNode(bngTooltip_default,{text:option.description||`No description available`,position:`top`},{default:withCtx(()=>[option.type===`dropdown`?(openBlock(),createBlock(unref(bngSmartSelect_default),{key:0,modelValue:option.value,items:option.options||[],"onUpdate:modelValue":newValue=>onOptionChanged(option.key,newValue),threshold:8},null,8,[`modelValue`,`items`,`onUpdate:modelValue`])):option.type===`checkbox`?(openBlock(),createBlock(unref(bngSwitch_default),{key:1,class:normalizeClass([`full-width-checkbox`,{active:option.value}]),modelValue:option.value,"onUpdate:modelValue":newValue=>onOptionChanged(option.key,newValue),labelBefore:``,alwaysTransparent:``},{default:withCtx(()=>[createTextVNode(toDisplayString(option.checkboxLabel),1)]),_:2},1032,[`class`,`modelValue`,`onUpdate:modelValue`])):option.type===`number`?(openBlock(),createBlock(unref(bngInputNew_default),{key:2,modelValue:option.value,min:option.min,max:option.max,showExternalButton:!1,type:`number`,"onUpdate:modelValue":newValue=>onOptionChanged(option.key,newValue)},null,8,[`modelValue`,`min`,`max`,`onUpdate:modelValue`])):createCommentVNode(``,!0)]),_:2},1032,[`text`])],2))),128))],2),__props.detailsMode===`displayControls`?(openBlock(),createElementBlock(`div`,_hoisted_3$206,[createVNode(unref(bngButton_default),{onClick:resetToDefaults,accent:`attention`,iconLeft:`trashBin1`,class:`reset-button`},{default:withCtx(()=>[..._cache[0]||=[createTextVNode(` Reset to Defaults `,-1)]]),_:1})])):createCommentVNode(``,!0)]))}},DisplayControls_default=__plugin_vue_export_helper_default(_sfc_main$317,[[`__scopeId`,`data-v-863e411a`]]),_sfc_main$316={__name:`SearchBar`,props:{searchText:{type:String,required:!0},setSearchText:{type:Function,required:!0},placeholder:{type:String,default:`Search...`},fullWidth:{type:Boolean,default:!1},showClearAllButton:{type:Boolean,default:!1}},emits:[`focus-item`,`clear-all`],setup(__props,{emit:__emit}){let props=__props,emit$1=__emit,clearSearch=()=>{props.setSearchText(``),emit$1(`focus-item`,`search`)},commitSearch=()=>{},onSearchChanged=value=>{props.setSearchText(value),emit$1(`focus-item`,`search`)};return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,{class:normalizeClass([`search-container`,{"full-width":__props.fullWidth}])},[createVNode(unref(bngInput_default),{class:`search-input`,modelValue:__props.searchText,placeholder:__props.placeholder,onValueChanged:onSearchChanged,onKeydown:withKeys(commitSearch,[`enter`]),onBlur:commitSearch,onFocus:_cache[0]||=$event=>emit$1(`focus-item`,`search`)},null,8,[`modelValue`,`placeholder`]),createBaseVNode(`div`,{class:normalizeClass([`search-icon-container`,{active:__props.searchText}]),onClick:clearSearch},[createVNode(unref(bngIcon_default),{type:unref(icons).search,class:`search-icon show-unhovered`},null,8,[`type`]),createVNode(unref(bngIcon_default),{type:unref(icons).trashBin2,class:`search-icon show-hovered`},null,8,[`type`])],2)],2))}},SearchBar_default=__plugin_vue_export_helper_default(_sfc_main$316,[[`__scopeId`,`data-v-67aff9c0`]]),_hoisted_1$281={class:`filters`},_hoisted_2$231={key:0,class:`search-section`},_hoisted_3$205={key:1,class:`filter-options-grid`},_hoisted_4$176={class:`option-label`},_hoisted_5$151={class:`option-icon`},_hoisted_6$130={key:2,class:`filters-container`},_hoisted_7$116={class:`filter-container`,navigable:``,tabindex:`0`},_hoisted_8$97={class:`filter-content`},_hoisted_9$87={key:0,class:`filter-options`},_hoisted_10$76={class:`filter-options-grid`},_hoisted_11$68={class:`option-label`},_hoisted_12$56={class:`option-icon`},_hoisted_13$48={key:1,class:`filter-options`},_hoisted_14$43={class:`range-bar-container`},_hoisted_15$41={class:`range-bar`},_hoisted_16$39={class:`range-inputs`},_hoisted_17$32={class:`range-input-group`},_hoisted_18$29={class:`range-input-group`},_sfc_main$315={__name:`DetailedFilters`,props:{filterList:{type:Array,required:!0},filterByProp:{type:Object,required:!0},searchText:{type:String,default:``},commonFilters:{type:Array,default:()=>[]},detailsMode:{type:String,required:!0},onlyCommonFilters:{type:Boolean,default:!0},isFilterLocked:{type:Function,required:!0},isFilterOptionLocked:{type:Function,required:!0},isRangeFilterLocked:{type:Function,required:!0},toggleFilter:{type:Function,required:!0},updateRangeFilter:{type:Function,required:!0},resetRangeFilter:{type:Function,required:!0},setSearchText:{type:Function,required:!0},setDetailsMode:{type:Function,required:!0}},emits:[`focus-item`],setup(__props,{emit:__emit}){let props=__props,emit$1=__emit,expandedAccordions=ref({}),pendingRangeUpdates=ref({}),debouncedUpdateFunctions=ref({}),getDebouncedUpdate=propName=>(debouncedUpdateFunctions.value[propName]||(debouncedUpdateFunctions.value[propName]=debounce(()=>{if(pendingRangeUpdates.value[propName]){let{min:min$1,max:max$1}=pendingRangeUpdates.value[propName];props.updateRangeFilter(propName,min$1,max$1),delete pendingRangeUpdates.value[propName]}},300)),debouncedUpdateFunctions.value[propName]);onUnmounted(()=>{Object.values(debouncedUpdateFunctions.value).forEach(debouncedFn=>{debouncedFn&&debouncedFn.cancel&&debouncedFn.cancel()}),debouncedUpdateFunctions.value={},pendingRangeUpdates.value={}});let formatFilterName=key=>key,getFilterOptionClass=(propName,option)=>{let filter=props.filterList.find(f=>f.propName===propName);if(!filter||!filter.options)return``;let allEnabled=filter.options.every(opt=>props.filterByProp[propName]?.[opt]===!0),currentOptionEnabled=props.filterByProp[propName]?.[option]===!0;return allEnabled?`filter-neutral`:currentOptionEnabled?`filter-active`:`filter-inactive`},hasActiveFilters=propName=>{if(!props.filterList)return!1;let filter=props.filterList.find(f=>f.propName===propName);if(!filter)return!1;if(filter.type===`range`){let filterData=props.filterByProp[propName];if(!filterData)return!1;let currentMin=filterData.min,currentMax=filterData.max,defaultMin=filter.min,defaultMax=filter.max;return currentMin>defaultMin||currentMaxprops.filterByProp[propName]?.[option]===!1)},toggleFilter=(propName,option,event)=>{if(props.isFilterOptionLocked(propName,option)){console.log(`Cannot toggle locked filter:`,propName,option);return}event&&(event.preventDefault(),event.stopPropagation()),emit$1(`focus-item`,`filters`),props.toggleFilter(propName,option)},onRangeFilterChanged=(propName,newValue,field)=>{if(props.isRangeFilterLocked(propName)){console.log(`Cannot update locked range filter:`,propName);return}let filter=props.filterList.find(f=>f.propName===propName);if(!filter||filter.type!==`range`)return;let filterData=props.filterByProp[propName];if(!filterData)return;let currentPending=pendingRangeUpdates.value[propName],min$1=currentPending?currentPending.min:filterData.min,max$1=currentPending?currentPending.max:filterData.max;field===`min`?min$1=newValue:field===`max`&&(max$1=newValue),min$1=Math.max(filter.min,Math.min(filter.max,min$1)),max$1=Math.max(filter.min,Math.min(filter.max,max$1)),min$1>max$1&&([min$1,max$1]=[max$1,min$1]),pendingRangeUpdates.value[propName]={min:min$1,max:max$1},getDebouncedUpdate(propName)(),emit$1(`focus-item`,propName)},isFilterActive=filter=>hasActiveFilters(filter.propName),getRangeBarStyle=propName=>{let filter=props.filterList.find(f=>f.propName===propName);if(!filter||filter.type!==`range`)return{};let filterData=props.filterByProp[propName];if(!filterData)return{};let currentMin=filterData.min,currentMax=filterData.max,totalRange=filter.max-filter.min,leftPosition=(currentMin-filter.min)/totalRange*100,width$1=(currentMax-currentMin)/totalRange*100;return{left:`${leftPosition}%`,width:`${width$1}%`,backgroundColor:`var(--bng-orange-500)`}};return onMounted(()=>{props.filterList&&props.filterList.forEach(filter=>{hasActiveFilters(filter.propName)&&(expandedAccordions.value[filter.propName]=!0)})}),(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$281,[__props.detailsMode===`filter`?(openBlock(),createElementBlock(`div`,_hoisted_2$231,[createVNode(SearchBar_default,{searchText:__props.searchText,setSearchText:__props.setSearchText,placeholder:`Search items...`,"full-width":!0,onFocusItem:_cache[0]||=$event=>emit$1(`focus-item`,$event)},null,8,[`searchText`,`setSearchText`])])):createCommentVNode(``,!0),__props.detailsMode===`filter`?createCommentVNode(``,!0):(openBlock(),createElementBlock(`div`,_hoisted_3$205,[(openBlock(!0),createElementBlock(Fragment,null,renderList(__props.commonFilters,(filter,index)=>(openBlock(),createBlock(unref(bngPill_default),{key:index,class:normalizeClass([[getFilterOptionClass(filter[0],filter[1]),{"filter-locked":props.isFilterOptionLocked(filter[0],filter[1])}],`filter-option-chip`]),style:normalizeStyle({cursor:props.isFilterOptionLocked(filter[0],filter[1])?`not-allowed`:`pointer`}),"bng-nav-item":``,onClick:$event=>toggleFilter(filter[0],filter[1])},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_4$176,toDisplayString(filter[1]),1),createBaseVNode(`span`,_hoisted_5$151,[__props.filterByProp&&__props.filterByProp[filter[0]]&&__props.filterByProp[filter[0]][filter[1]]?(openBlock(),createBlock(unref(bngIcon_default),{key:0,type:unref(icons).checkmark},null,8,[`type`])):(openBlock(),createBlock(unref(bngIcon_default),{key:1,type:unref(icons).xmark},null,8,[`type`])),props.isFilterOptionLocked(filter[0],filter[1])?(openBlock(),createBlock(unref(bngIcon_default),{key:2,type:unref(icons).lockClosed,class:`lock-icon`},null,8,[`type`])):createCommentVNode(``,!0)])]),_:2},1032,[`class`,`style`,`onClick`]))),128))])),__props.detailsMode===`filter`?(openBlock(),createElementBlock(`div`,_hoisted_6$130,[createVNode(unref(accordion_default),{class:`filters-accordion`},{default:withCtx(()=>[(openBlock(!0),createElementBlock(Fragment,null,renderList(__props.filterList,filter=>(openBlock(),createElementBlock(`div`,{key:filter.propName,class:`filter-wrapper`},[createVNode(unref(accordionItem_default),{navigable:``,static:!filter.options||filter.options.length===0,"arrow-big":``,"expand-hint-inline":``,expanded:expandedAccordions.value[filter.propName],class:normalizeClass({"has-active-filters":isFilterActive(filter)}),onFocus:$event=>emit$1(`focus-item`,filter.propName)},{caption:withCtx(()=>[createBaseVNode(`div`,_hoisted_7$116,[createBaseVNode(`div`,_hoisted_8$97,toDisplayString(formatFilterName(filter.propName)),1)])]),default:withCtx(()=>[filter.type===`set`&&filter.options?(openBlock(),createElementBlock(`div`,_hoisted_9$87,[createBaseVNode(`div`,_hoisted_10$76,[(openBlock(!0),createElementBlock(Fragment,null,renderList(filter.options,(option,index)=>(openBlock(),createBlock(unref(bngPill_default),{key:index,class:normalizeClass([[getFilterOptionClass(filter.propName,option),{"filter-locked":props.isFilterOptionLocked(filter.propName,option)}],`filter-option-chip`]),style:normalizeStyle({cursor:props.isFilterOptionLocked(filter.propName,option)?`not-allowed`:`pointer`}),onClick:$event=>toggleFilter(filter.propName,option)},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_11$68,toDisplayString(option),1),createBaseVNode(`span`,_hoisted_12$56,[__props.filterByProp[filter.propName][option]?(openBlock(),createBlock(unref(bngIcon_default),{key:0,type:unref(icons).checkmark},null,8,[`type`])):(openBlock(),createBlock(unref(bngIcon_default),{key:1,type:unref(icons).abandon},null,8,[`type`])),props.isFilterOptionLocked(filter.propName,option)?(openBlock(),createBlock(unref(bngIcon_default),{key:2,type:unref(icons).lockClosed,class:`lock-icon`},null,8,[`type`])):createCommentVNode(``,!0)])]),_:2},1032,[`class`,`style`,`onClick`]))),128))])])):createCommentVNode(``,!0),filter.type===`range`?(openBlock(),createElementBlock(`div`,_hoisted_13$48,[createBaseVNode(`div`,_hoisted_14$43,[createBaseVNode(`div`,_hoisted_15$41,[createBaseVNode(`div`,{class:`range-selection`,style:normalizeStyle(getRangeBarStyle(filter.propName))},null,4)])]),createBaseVNode(`div`,_hoisted_16$39,[createBaseVNode(`div`,_hoisted_17$32,[_cache[1]||=createBaseVNode(`label`,{class:`range-label`},`Min:`,-1),(openBlock(),createBlock(unref(bngInput_default),{key:filter.propName+`min`,modelValue:__props.filterByProp[filter.propName].min,type:`number`,min:filter.min,max:filter.max,step:filter.step||1,disabled:props.isRangeFilterLocked(filter.propName),onValueChanged:val=>onRangeFilterChanged(filter.propName,val,`min`)},null,8,[`modelValue`,`min`,`max`,`step`,`disabled`,`onValueChanged`]))]),createBaseVNode(`div`,_hoisted_18$29,[_cache[2]||=createBaseVNode(`label`,{class:`range-label`},`Max:`,-1),(openBlock(),createBlock(unref(bngInput_default),{key:filter.propName+`max`,modelValue:__props.filterByProp[filter.propName].max,type:`number`,min:filter.min,max:filter.max,step:filter.step||1,disabled:props.isRangeFilterLocked(filter.propName),onValueChanged:val=>onRangeFilterChanged(filter.propName,val,`max`)},null,8,[`modelValue`,`min`,`max`,`step`,`disabled`,`onValueChanged`]))])])])):createCommentVNode(``,!0)]),_:2},1032,[`static`,`expanded`,`class`,`onFocus`])]))),128))]),_:1})])):createCommentVNode(``,!0)]))}},DetailedFilters_default=__plugin_vue_export_helper_default(_sfc_main$315,[[`__scopeId`,`data-v-a4758924`]]),_hoisted_1$280={key:1},_hoisted_2$230={key:1},_hoisted_3$204={key:1},_hoisted_4$175={key:1},_sfc_main$314={__name:`HeaderButtons`,props:{canSwitchDetails:{type:Boolean,default:!1},hiddenTabs:{type:Array,default:()=>[]},detailsMode:{type:String,required:!0},slim:{type:Boolean,default:!1}},emits:[`switch-details-mode`],setup(__props){return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,{class:normalizeClass([`header-buttons`,{slim:__props.slim}])},[withDirectives(createVNode(unref(bngBinding_default),{class:`header-buttons-binding`,"ui-event":`context`,controller:``,"track-ignore":``},null,512),[[vShow,__props.canSwitchDetails]]),__props.hiddenTabs.includes(`detail`)?createCommentVNode(``,!0):withDirectives((openBlock(),createBlock(unref(bngButton_default),{key:0,class:normalizeClass([`header-button`,{selected:__props.detailsMode===`detail`}]),accent:unref(ACCENTS).text,onClick:_cache[0]||=$event=>_ctx.$emit(`switch-details-mode`,`detail`)},{default:withCtx(()=>[__props.slim?(openBlock(),createBlock(unref(bngIcon_default),{key:0,type:unref(icons).info},null,8,[`type`])):(openBlock(),createElementBlock(`span`,_hoisted_1$280,`Details`))]),_:1},8,[`class`,`accent`])),[[unref(BngTooltip_default),`Details`,`top`]]),__props.hiddenTabs.includes(`advanced`)?createCommentVNode(``,!0):withDirectives((openBlock(),createBlock(unref(bngButton_default),{key:1,class:normalizeClass([`header-button`,{selected:__props.detailsMode===`advanced`}]),accent:unref(ACCENTS).text,onClick:_cache[1]||=$event=>_ctx.$emit(`switch-details-mode`,`advanced`)},{default:withCtx(()=>[__props.slim?(openBlock(),createBlock(unref(bngIcon_default),{key:0,type:unref(icons).laneProperties},null,8,[`type`])):(openBlock(),createElementBlock(`span`,_hoisted_2$230,`Advanced`))]),_:1},8,[`class`,`accent`])),[[unref(BngTooltip_default),`Advanced`,`top`]]),__props.hiddenTabs.includes(`filter`)?createCommentVNode(``,!0):withDirectives((openBlock(),createBlock(unref(bngButton_default),{key:2,class:normalizeClass([`header-button`,{selected:__props.detailsMode===`filter`}]),accent:unref(ACCENTS).text,onClick:_cache[2]||=$event=>_ctx.$emit(`switch-details-mode`,`filter`)},{default:withCtx(()=>[__props.slim?(openBlock(),createBlock(unref(bngIcon_default),{key:0,type:unref(icons).filter},null,8,[`type`])):(openBlock(),createElementBlock(`span`,_hoisted_3$204,`Filters`))]),_:1},8,[`class`,`accent`])),[[unref(BngTooltip_default),`Filters`,`top`]]),__props.hiddenTabs.includes(`displayControls`)?createCommentVNode(``,!0):withDirectives((openBlock(),createBlock(unref(bngButton_default),{key:3,class:normalizeClass([`header-button`,{selected:__props.detailsMode===`displayControls`}]),accent:unref(ACCENTS).text,onClick:_cache[3]||=$event=>_ctx.$emit(`switch-details-mode`,`displayControls`)},{default:withCtx(()=>[__props.slim?(openBlock(),createBlock(unref(bngIcon_default),{key:0,type:unref(icons).adjust},null,8,[`type`])):(openBlock(),createElementBlock(`span`,_hoisted_4$175,`Display`))]),_:1},8,[`class`,`accent`])),[[unref(BngTooltip_default),`Display`,`top`]])],2))}},HeaderButtons_default=__plugin_vue_export_helper_default(_sfc_main$314,[[`__scopeId`,`data-v-157cdc63`]]),_sfc_main$313={__name:`Slideshow`,props:{images:Array,transition:Boolean,delay:{type:Number,default:1e4},parent:Object,shuffle:Boolean},setup(__props,{expose:__expose}){useCssVars(_ctx=>({v095d52f4:imgPrev.value,v095f8174:imgNext.value}));let props=__props,anim=ref(!1),imgPrev=ref(``),imgNext=ref(``),imgIndex=ref(-1),sequence=[],sequenceIndex=-1,tmrMain,tmrAnim,wImages,wParent;__expose({imgIndex,nextImage,carousel:{showNext:nextImage}}),onUnmounted(stopTimers);function stopTimers(){tmrMain&&=(clearTimeout(tmrMain),null),tmrAnim&&=(clearTimeout(tmrAnim),null)}watch(()=>props.parent,parent=>{wImages&&=(wImages(),null),wParent&&=(wParent(),null),parent?wParent=watch([()=>props.images,()=>parent.imgIndex],([images,index])=>{images&&(imgIndex.value=index,images.length>0&&nextTick(nextImage))},{immediate:!0}):wImages=watch([()=>props.images,()=>props.shuffle],([images,shuffle])=>{images&&(imgIndex.value=-1,images.length>0&&(shuffle&&(sequenceIndex=-1,sequence=Array.from(images).map((_,i)=>i).sort(()=>Math.random()-.5)),nextTick(nextImage)))},{immediate:!0})},{immediate:!0});function nextImage(){stopTimers(),props.parent||(props.shuffle&&sequence.length>0?(sequenceIndex=++sequenceIndex%props.images.length,imgIndex.value=sequence[sequenceIndex]):imgIndex.value=++imgIndex.value%props.images.length);let img=`url("${getAssetURL(props.images[imgIndex.value])}")`;props.transition?(imgNext.value=img,anim.value=!0,tmrAnim=setTimeout(()=>{tmrAnim=null,anim.value=!1,imgPrev.value=imgNext.value,imgNext.value=``},1e3)):imgPrev.value=img,!props.parent&&props.images.length>1&&(tmrMain=setTimeout(nextImage,props.delay))}return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,{class:normalizeClass({anim:anim.value})},null,2))}},Slideshow_default=__plugin_vue_export_helper_default(_sfc_main$313,[[`__scopeId`,`data-v-f788946d`]]),_hoisted_1$279={key:0,class:`blur-wrap`},_sfc_main$312={__name:`BlurBackground`,setup(__props){let parentCarousel=inject(`mainBackground`),backgroundsBlur=inject(`mainBackgroundBlur`),bgRequired=sysInfo_default.mainMenuBackgroundRequired;return(_ctx,_cache)=>unref(bgRequired)?(openBlock(),createElementBlock(`div`,_hoisted_1$279,[createVNode(Slideshow_default,{class:`blur-carousel`,images:unref(backgroundsBlur),parent:unref(parentCarousel),transition:``},null,8,[`images`,`parent`])])):createCommentVNode(``,!0)}},BlurBackground_default=__plugin_vue_export_helper_default(_sfc_main$312,[[`__scopeId`,`data-v-cc1c4815`]]),_hoisted_1$278={class:`header-container`},_hoisted_2$229={key:1},_hoisted_3$203={class:`content-container`},_hoisted_4$174={class:`header-back-button`},_hoisted_5$150={key:0,class:`header-title-container`},_hoisted_6$129={class:`header-back-button`},_hoisted_7$115={class:`header-back-button`},_hoisted_8$96={key:0,class:`scrollable-content`},_hoisted_9$86={class:`details-mode-buttons`},_hoisted_10$75={key:1,class:`scrollable-content`},_hoisted_11$67={key:0,class:`details-content`},_hoisted_12$55={key:1,class:`scrollable-content`},_sfc_main$311={__name:`GridSelector`,props:{backendName:{type:String,default:`gridSelector`},routePath:{type:String,default:`/grid-selector`},defaultPath:{type:Object,default:()=>({keys:[`allModels`]})},defaultDetailsMode:{type:String,default:`detail`},hiddenTabs:{type:Array,default:()=>[]},tileImagesTopAligned:{type:Boolean,default:!1},doubleClickOverride:{type:Function,default:null},noBreadcrumbs:{type:Boolean,default:!1},overrideBackFromGrid:{type:Function,default:null},inlineHeaderContainer:{type:Boolean,default:!0},selectCallback:{type:Function,default:null},bubbleEvents:{type:Array,default:()=>[]}},setup(__props,{expose:__expose}){let props=__props,{showIfController}=storeToRefs(controls_default()),store$1=useGridSelector(props.backendName,props.defaultPath,props.defaultDetailsMode),{groups,displayData,detailsMode,selectedItem,showScreenHeader,screenHeaderTitle,screenHeaderPath,activeItemDetails,activeItem,activeFilters}=store$1,route=useRoute(),router$1=useRouter(),detailsModeTitles={detail:`Details`,advanced:`Advanced`,filter:`Filters`,displayControls:`Display`},detailsModeBackTo={filter:`advanced`,displayControls:`advanced`};watch(()=>[props.backendName,props.defaultPath,props.defaultDetailsMode],([newBackendName,newDefaultPath,newDefaultDetailsMode],[oldBackendName,oldDefaultPath,oldDefaultDetailsMode])=>{newBackendName!==oldBackendName&&newDefaultPath&&newDefaultPath.keys&&store$1.setCurrentPath(newDefaultPath),newDefaultDetailsMode!==oldDefaultDetailsMode&&store$1.setDetailsMode(newDefaultDetailsMode)},{deep:!0});let scopedNavState=reactive({isGridActive:!1,isDetailsActive:!1}),setBack=inject(`setBack`),showTopbarTabBindings=inject(`showTopbarTabBindings`),showTopbarBackBinding=inject(`showTopbarBackBinding`),showBreadcrumbsBack=ref(!1),canUseTopbar=ref(!0);watch(()=>scopedNavState.isDetailsActive,val=>{canUseTopbar.value=!val,showTopbarTabBindings(canUseTopbar.value)}),watch(screenHeaderPath,val=>{showBreadcrumbsBack.value=val&&val.length>2,showTopbarBackBinding(!showBreadcrumbsBack.value)});let switchSeq=computed(()=>[`detail`,`advanced`,`displayControls`].filter(tab=>!props.hiddenTabs.includes(tab))),getNextSwitchSeq=mode=>{mode||=detailsMode.value,mode===`filter`&&(mode=`advanced`);let seq=switchSeq.value;if(seq.length===0)return`detail`;let currentIndex=seq.indexOf(mode);return currentIndex===-1?seq[0]:seq[(currentIndex+1)%seq.length]},canSeeDetails=ref(!0),hasSelectedItem=computed(()=>!!store$1.selectedItem.value),canSwitchDetails=computed(()=>activeSectionScope.value!==`default`||detailsMode.value===`advanced`);function switchDetailsMode(mode){console.log(`switchDetailsMode`,mode),typeof mode!=`string`&&(mode=getNextSwitchSeq(mode)),mode===`detail`&&!canSeeDetails.value&&(mode=getNextSwitchSeq(mode)),console.log(`switchDetailsMode`,mode),store$1.setDetailsMode(mode),switchScope(`details`)}function onToggleSectionScope(){activeSectionScope.value===`grid`?switchScope(`details`):switchDetailsMode()}let activeSectionScope=ref(`grid`);function switchScope(name,force=!1){name||=activeSectionScope.value===`grid`?`details`:`grid`,name===`details`?(scopedNavState.isGridActive=!1,force&&(scopedNavState.isDetailsActive=!1),nextTick(()=>{activeSectionScope.value=name,scopedNavState.isDetailsActive=!0})):(scopedNavState.isDetailsActive=!1,force&&(scopedNavState.isGridActive=!1),nextTick(()=>{activeSectionScope.value=name,scopedNavState.isGridActive=!0}))}let onGridActivate=()=>{scopedNavState.isGridActive=!0},onGridDeactivate=event=>{scopedNavState.isGridActive=!1},onDetailsActivate=()=>{scopedNavState.isDetailsActive=!0},onDetailsDeactivate=event=>{scopedNavState.isDetailsActive=!1},setDetailsScope=info=>{switchScope(`details`)},canBubbleGridEvent=event=>!!(event.detail.name===`rotate_v_cam`||event.detail.name===`menu`||canUseTopbar.value&&(event.detail.name===`tab_l`||event.detail.name===`tab_r`)||props.bubbleEvents.includes(event.detail.name)),canBubbleDetailsEvent=event=>!!(event.detail.name===`rotate_v_cam`||props.bubbleEvents.includes(event.detail.name)),canDeactivateGrid=()=>screenHeaderPath.value.length<=1,onBackFromDetails=()=>{if(detailsMode.value===`displayControls`||detailsMode.value===`filter`){toggleDetailsMode(`advanced`);return}switchScope(`grid`)},onToggleFavorite=()=>{store$1.toggleFavourite(activeItem.value)},gridContentRef=ref(null),scrollPositions$1=ref(new Map),scrollTimeout=null,displaySize=computed(()=>{let option=displayData.value.find(option$1=>option$1.key===`displaySize`);return option?option.value:`medium`});store$1.initialize(),store$1.setOnBackFromDetailsCallback(()=>{onBackFromDetails()}),props.defaultPath.keys;let currentPathSegments=computed(()=>{let pathMatch=route.params.pathMatch;if(!pathMatch)return props.defaultPath?.keys||(Array.isArray(props.defaultPath)?props.defaultPath:[]);let segments=Array.isArray(pathMatch)?pathMatch.map(segment=>decodeURIComponent(segment)):[decodeURIComponent(pathMatch)];if(route.params.itemDetails){let itemDetails=Array.isArray(route.params.itemDetails)?route.params.itemDetails.map(segment=>decodeURIComponent(segment)):[decodeURIComponent(route.params.itemDetails)];segments.push(...itemDetails)}return segments}),saveScrollPosition$1=()=>{if(!gridContentRef.value)return;let pathKey=currentPathSegments.value.join(`/`),scrollTop=gridContentRef.value.scrollTop;scrollPositions$1.value.set(pathKey,scrollTop)},debouncedSaveScrollPosition=()=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>{saveScrollPosition$1()},100)},restoreScrollPosition=()=>{if(!gridContentRef.value)return;let pathKey=currentPathSegments.value.join(`/`),savedPosition=scrollPositions$1.value.get(pathKey);savedPosition!==void 0&&nextTick(()=>{gridContentRef.value.scrollTop=savedPosition})};watch(groups,async newGroups=>{newGroups&&(await nextTick(),await nextTick(),store$1.notifyUIReady(),restoreScrollPosition())},{immediate:!0}),watch([currentPathSegments],async([segments],[oldSegments])=>{if(oldSegments&&gridContentRef.value){let oldPathKey=oldSegments.join(`/`),currentScrollTop=gridContentRef.value.scrollTop;scrollPositions$1.value.set(oldPathKey,currentScrollTop)}let path={keys:segments};await store$1.setCurrentPath(path)},{immediate:!0}),watch(gridContentRef,newElement=>{if(newElement){let handleScroll=()=>{debouncedSaveScrollPosition()};newElement.addEventListener(`scroll`,handleScroll),newElement._scrollHandler=handleScroll}},{immediate:!0}),onBeforeMount(()=>{Lua_default.simTimeAuthority.pushPauseRequest(`gridSelector`)}),onMounted(()=>{setBack(props.backendName,onBackFromGrid),nextTick(()=>{scopedNavState.isGridActive=!0})}),onUnmounted(()=>{setBack(props.backendName),gridContentRef.value&&gridContentRef.value._scrollHandler&&gridContentRef.value.removeEventListener(`scroll`,gridContentRef.value._scrollHandler),scrollTimeout&&clearTimeout(scrollTimeout),Lua_default.ui_gridSelector.closedFromUI(props.backendName),Lua_default.simTimeAuthority.popPauseRequest(`gridSelector`)});let onItemFocus=item=>{item&&item.showDetails&&store$1.setPreviewItem(item)},onItemSelect=async(item,doNavigation=!0)=>{if(item.gotoPath&&Array.isArray(item.gotoPath))store$1.prevSelectedItem.value=item.key,doNavigation&&routeNav(item),store$1.clearSelectedItem(),doNavigation&&switchScope(`grid`),props.selectCallback&&await props.selectCallback(item,doNavigation);else if(item.showDetails){item.key,selectedItem.value?.key;let consumed=!1;props.selectCallback&&(consumed=await props.selectCallback(item,doNavigation)),consumed||(await store$1.setSelectedItem(item),doNavigation&&switchScope(`details`))}},onGridWrapperClick=event=>{store$1.clearSelectedItem(),switchScope(`grid`,!0)},onDetailsWrapperClick=event=>{switchScope(`details`,!0)},onItemDeselect=()=>{store$1.clearSelectedItem()},toggleDetailsMode=mode=>{store$1.setDetailsMode(mode)};function routeNav(item){if(item.gotoAngularState)return;let encodedPath=item.gotoPath.map(segment=>encodeURIComponent(segment)).join(`/`);router$1.push(`${props.routePath}/${encodedPath}`)}let onBackFromGrid=()=>{if(console.log(`onBackFromGrid`,screenHeaderPath.value),props.overrideBackFromGrid&&screenHeaderPath.value.length<=2)return props.overrideBackFromGrid();if(screenHeaderPath.value.length>1){let item=screenHeaderPath.value[screenHeaderPath.value.length-2];return store$1.prevSelectedItem.value&&(store$1.autoFocusKey.value=store$1.prevSelectedItem.value),gotoHeaderItem(item),!1}return!0},onBreadBack=()=>nextTick(onBackFromGrid),clearSearch=()=>{store$1.setSearchText(``)},clearFilters=()=>{console.log(`clearFilters`,activeFilters.value);for(let filter of activeFilters.value)console.log(`clearFilter`,filter),filter&&filter.type===`range`?store$1.resetRangeFilter(filter.propName):store$1.resetSetFilter(filter.propName)},setCurrentPath=path=>{store$1.setCurrentPath(path)},gotoHeaderItem=item=>{console.log(`gotoHeaderItem`,item),item.gotoAngularState?window.bngVue.gotoAngularState(item.gotoAngularState):item.gotoPath&&(item.clearSearch&&clearSearch(),item.clearFilters&&clearFilters(),setCurrentPath({keys:item.gotoPath}),routeNav(item),switchScope(`grid`))};return __expose({screenHeaderPath,clearSearch,clearFilters,setCurrentPath}),(_ctx,_cache)=>withDirectives((openBlock(),createBlock(unref(layoutSingle_default),{class:`grid-selector`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_1$278,[__props.noBreadcrumbs?(openBlock(),createElementBlock(`div`,_hoisted_2$229)):(openBlock(),createBlock(unref(bngBreadcrumbs_default),{key:0,class:`header-breadcrumbs`,items:unref(screenHeaderPath),limit:`5`,simple:``,"disable-last-item":``,"show-back-button":showBreadcrumbsBack.value,onClick:gotoHeaderItem,onBack:onBreadBack},null,8,[`items`,`show-back-button`])),__props.inlineHeaderContainer?createCommentVNode(``,!0):(openBlock(),createBlock(HeaderButtons_default,{key:2,"can-switch-details":canSwitchDetails.value,"hidden-tabs":props.hiddenTabs,"details-mode":unref(detailsMode),onSwitchDetailsMode:switchDetailsMode},null,8,[`can-switch-details`,`hidden-tabs`,`details-mode`]))]),createBaseVNode(`div`,_hoisted_3$203,[createBaseVNode(`div`,{class:normalizeClass([`grid-wrapper`,{active:activeSectionScope.value===`grid`}])},[createVNode(BlurBackground_default),unref(showScreenHeader)?(openBlock(),createElementBlock(`div`,{key:0,class:normalizeClass([`header-row`,{active:activeSectionScope.value===`grid`&&unref(showIfController),"no-controller":!unref(showIfController)}])},[createVNode(unref(bngScreenHeadingV2_default),{type:`2`,class:`header-title-v2`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(screenHeaderTitle)),1)]),_:1}),withDirectives(createBaseVNode(`div`,_hoisted_4$174,[createVNode(unref(bngBinding_default),{"ui-event":`back`,controller:``}),createVNode(unref(bngIcon_default),{type:unref(icons).undo},null,8,[`type`])],512),[[vShow,activeSectionScope.value===`grid`&&unref(showIfController)&¤tPathSegments.value.length>1]])],2)):createCommentVNode(``,!0),withDirectives((openBlock(),createElementBlock(`div`,{class:`grid-content`,ref_key:`gridContentRef`,ref:gridContentRef,"bng-nav-scroll":``,"bng-no-nav":`true`,tabindex:`-1`,onActivate:onGridActivate,onDeactivate:onGridDeactivate,onClick:onGridWrapperClick},[createVNode(Grid_default$1,{"in-details":activeSectionScope.value===`details`&&unref(detailsMode)===`detail`,"display-size":displaySize.value,"backend-name":props.backendName,"auto-focus-key":unref(store$1).autoFocusKey.value,"active-item":unref(store$1).activeItem.value,groups:unref(groups),"tile-images-top-aligned":__props.tileImagesTopAligned,onFocusItem:onItemFocus,onSelectItem:onItemSelect,onDeselectItem:onItemDeselect,"double-click-override":__props.doubleClickOverride},null,8,[`in-details`,`display-size`,`backend-name`,`auto-focus-key`,`active-item`,`groups`,`tile-images-top-aligned`,`double-click-override`])],32)),[[unref(BngScopedNav_default),{activated:scopedNavState.isGridActive,canBubbleEvent:canBubbleGridEvent,canDeactivate:canDeactivateGrid,preferAutoFocus:!0,autoFocusDelay:400}],[unref(BngOnUiNav_default),onToggleSectionScope,`context`],[unref(BngUiNavLabel_default),`Filters and more`,`context`],[unref(BngOnUiNav_default),onBackFromGrid,`back`],[unref(BngUiNavScroll_default)]])],2),withDirectives((openBlock(),createElementBlock(`div`,{class:normalizeClass([`details-wrapper wide`,{active:activeSectionScope.value===`details`,"no-controller":!unref(showIfController)}]),tabindex:`-1`,"bng-no-nav":`true`,onActivate:onDetailsActivate,onDeactivate:onDetailsDeactivate,onClick:onDetailsWrapperClick},[createVNode(BlurBackground_default),createBaseVNode(`div`,{class:normalizeClass([`header-row`,{active:activeSectionScope.value===`details`&&unref(showIfController),"no-controller":!unref(showIfController)}]),"bng-no-child-nav":`true`},[createVNode(HeaderButtons_default,{slim:``,"can-switch-details":canSwitchDetails.value,"hidden-tabs":props.hiddenTabs,"details-mode":unref(detailsMode),onSwitchDetailsMode:switchDetailsMode},null,8,[`can-switch-details`,`hidden-tabs`,`details-mode`]),__props.inlineHeaderContainer?createCommentVNode(``,!0):(openBlock(),createElementBlock(`div`,_hoisted_5$150,[createVNode(unref(bngCardHeading_default),{type:`ribbon`,class:`header-title`},{default:withCtx(()=>[createTextVNode(toDisplayString(detailsModeTitles[unref(detailsMode)]),1)]),_:1}),detailsModeBackTo[unref(detailsMode)]?(openBlock(),createBlock(unref(bngButton_default),{key:0,"bng-no-nav":`true`,onClick:_cache[0]||=$event=>toggleDetailsMode(detailsModeBackTo[unref(detailsMode)]),accent:unref(ACCENTS).outlined,iconRight:`undo`},{default:withCtx(()=>[createVNode(unref(bngBinding_default),{"ui-event":`back`,controller:``})]),_:1},8,[`accent`])):createCommentVNode(``,!0),withDirectives(createBaseVNode(`div`,_hoisted_6$129,[createVNode(unref(bngIcon_default),{type:unref(icons).adjust},null,8,[`type`]),createVNode(unref(bngBinding_default),{"ui-event":`context`,controller:``})],512),[[vShow,activeSectionScope.value===`grid`||!unref(showIfController)]]),withDirectives(createBaseVNode(`div`,_hoisted_7$115,[createVNode(unref(bngBinding_default),{"ui-event":`back`,controller:``}),createVNode(unref(bngIcon_default),{type:unref(icons).undo},null,8,[`type`])],512),[[vShow,activeSectionScope.value===`details`&&unref(showIfController)]])]))],2),unref(detailsMode)===`advanced`?(openBlock(),createElementBlock(`div`,_hoisted_8$96,[createVNode(SearchBar_default,{searchText:unref(store$1).searchText.value,setSearchText:unref(store$1).setSearchText},null,8,[`searchText`,`setSearchText`]),createVNode(DetailedFilters_default,{filterList:unref(store$1).filterList.value,filterByProp:unref(store$1).filterByProp.value,searchText:unref(store$1).searchText.value,commonFilters:unref(store$1).commonFilters.value,detailsMode:unref(store$1).detailsMode.value,onlyCommonFilters:unref(store$1).onlyCommonFilters.value,isFilterLocked:unref(store$1).isFilterLocked,isFilterOptionLocked:unref(store$1).isFilterOptionLocked,isRangeFilterLocked:unref(store$1).isRangeFilterLocked,toggleFilter:unref(store$1).toggleFilter,updateRangeFilter:unref(store$1).updateRangeFilter,resetRangeFilter:unref(store$1).resetRangeFilter,setSearchText:unref(store$1).setSearchText,setDetailsMode:unref(store$1).setDetailsMode},null,8,[`filterList`,`filterByProp`,`searchText`,`commonFilters`,`detailsMode`,`onlyCommonFilters`,`isFilterLocked`,`isFilterOptionLocked`,`isRangeFilterLocked`,`toggleFilter`,`updateRangeFilter`,`resetRangeFilter`,`setSearchText`,`setDetailsMode`]),createVNode(DisplayControls_default,{displayData:unref(store$1).displayData.value,detailsMode:unref(store$1).detailsMode.value,updateDisplayData:unref(store$1).updateDisplayData,resetDisplayDataToDefaults:unref(store$1).resetDisplayDataToDefaults,setDetailsMode:unref(store$1).setDetailsMode},null,8,[`displayData`,`detailsMode`,`updateDisplayData`,`resetDisplayDataToDefaults`,`setDetailsMode`]),createBaseVNode(`div`,_hoisted_9$86,[createVNode(unref(bngButton_default),{onClick:_cache[1]||=$event=>toggleDetailsMode(`filter`),accent:unref(ACCENTS).secondary,iconLeft:`filter`},{default:withCtx(()=>[..._cache[3]||=[createTextVNode(` More filters... `,-1)]]),_:1},8,[`accent`]),createVNode(unref(bngButton_default),{onClick:_cache[2]||=$event=>toggleDetailsMode(`displayControls`),accent:unref(ACCENTS).secondary,iconLeft:`adjust`},{default:withCtx(()=>[..._cache[4]||=[createTextVNode(` Display Options `,-1)]]),_:1},8,[`accent`])]),createVNode(unref(bngCardHeading_default),{type:`line`,class:`heading`},{default:withCtx(()=>[..._cache[5]||=[createTextVNode(`Management`,-1)]]),_:1}),renderSlot(_ctx.$slots,`management-details`,{managementDetails:unref(store$1).managementDetails.value,executeButton:unref(store$1).executeButton},void 0,!0)])):unref(detailsMode)===`filter`?(openBlock(),createElementBlock(`div`,_hoisted_10$75,[createVNode(DetailedFilters_default,{filterList:unref(store$1).filterList.value,filterByProp:unref(store$1).filterByProp.value,searchText:unref(store$1).searchText.value,commonFilters:unref(store$1).commonFilters.value,detailsMode:unref(store$1).detailsMode.value,onlyCommonFilters:unref(store$1).onlyCommonFilters.value,isFilterLocked:unref(store$1).isFilterLocked,isFilterOptionLocked:unref(store$1).isFilterOptionLocked,isRangeFilterLocked:unref(store$1).isRangeFilterLocked,toggleFilter:unref(store$1).toggleFilter,updateRangeFilter:unref(store$1).updateRangeFilter,resetRangeFilter:unref(store$1).resetRangeFilter,setSearchText:unref(store$1).setSearchText,setDetailsMode:unref(store$1).setDetailsMode},null,8,[`filterList`,`filterByProp`,`searchText`,`commonFilters`,`detailsMode`,`onlyCommonFilters`,`isFilterLocked`,`isFilterOptionLocked`,`isRangeFilterLocked`,`toggleFilter`,`updateRangeFilter`,`resetRangeFilter`,`setSearchText`,`setDetailsMode`])])):unref(detailsMode)===`displayControls`?(openBlock(),createBlock(DisplayControls_default,{key:2,class:`scrollable-content`,displayData:unref(store$1).displayData.value,detailsMode:unref(store$1).detailsMode.value,updateDisplayData:unref(store$1).updateDisplayData,resetDisplayDataToDefaults:unref(store$1).resetDisplayDataToDefaults,setDetailsMode:unref(store$1).setDetailsMode},null,8,[`displayData`,`detailsMode`,`updateDisplayData`,`resetDisplayDataToDefaults`,`setDetailsMode`])):unref(detailsMode)===`detail`?(openBlock(),createElementBlock(Fragment,{key:3},[hasSelectedItem.value?(openBlock(),createElementBlock(`div`,_hoisted_11$67,[renderSlot(_ctx.$slots,`item-details`,{activeItem:unref(store$1).activeItem.value,activeItemDetails:unref(store$1).activeItemDetails.value,executeButton:unref(store$1).executeButton,toggleFavourite:unref(store$1).toggleFavourite,exploreFolder:unref(store$1).exploreFolder,goToMod:unref(store$1).goToMod,onFocusItem:setDetailsScope},void 0,!0)])):(openBlock(),createElementBlock(`div`,_hoisted_12$55,[createVNode(SearchBar_default,{searchText:unref(store$1).searchText.value,setSearchText:unref(store$1).setSearchText},null,8,[`searchText`,`setSearchText`]),createVNode(DetailedFilters_default,{filterList:unref(store$1).filterList.value,filterByProp:unref(store$1).filterByProp.value,searchText:unref(store$1).searchText.value,commonFilters:unref(store$1).commonFilters.value,detailsMode:unref(store$1).detailsMode.value,onlyCommonFilters:unref(store$1).onlyCommonFilters.value,isFilterLocked:unref(store$1).isFilterLocked,isFilterOptionLocked:unref(store$1).isFilterOptionLocked,isRangeFilterLocked:unref(store$1).isRangeFilterLocked,toggleFilter:unref(store$1).toggleFilter,updateRangeFilter:unref(store$1).updateRangeFilter,resetRangeFilter:unref(store$1).resetRangeFilter,setSearchText:unref(store$1).setSearchText,setDetailsMode:unref(store$1).setDetailsMode},null,8,[`filterList`,`filterByProp`,`searchText`,`commonFilters`,`detailsMode`,`onlyCommonFilters`,`isFilterLocked`,`isFilterOptionLocked`,`isRangeFilterLocked`,`toggleFilter`,`updateRangeFilter`,`resetRangeFilter`,`setSearchText`,`setDetailsMode`]),createVNode(DisplayControls_default,{displayData:unref(store$1).displayData.value,detailsMode:unref(store$1).detailsMode.value,updateDisplayData:unref(store$1).updateDisplayData,resetDisplayDataToDefaults:unref(store$1).resetDisplayDataToDefaults,setDetailsMode:unref(store$1).setDetailsMode},null,8,[`displayData`,`detailsMode`,`updateDisplayData`,`resetDisplayDataToDefaults`,`setDetailsMode`]),createVNode(unref(bngCardHeading_default),{type:`line`,class:`heading`},{default:withCtx(()=>[..._cache[6]||=[createTextVNode(`Info`,-1)]]),_:1}),_cache[7]||=createBaseVNode(`div`,{class:`scrollable-content`},` Please select an item to see details. `,-1)]))],64)):createCommentVNode(``,!0)],34)),[[unref(BngScopedNav_default),{activated:scopedNavState.isDetailsActive,canDeactivate:()=>!1,canBubbleEvent:canBubbleDetailsEvent,bubbleWhitelistEvents:[`menu`]}],[unref(BngOnUiNav_default),onToggleSectionScope,`context`],[unref(BngUiNavLabel_default),`Filters and more`,`context`],[unref(BngOnUiNav_default),onToggleFavorite,`action_2`],[unref(BngUiNavLabel_default),`Toggle favorite`,`action_2`],[unref(BngOnUiNav_default),onBackFromDetails,`back`,{focusRequired:!0}]])])]),_:3})),[[unref(BngBlur_default)],[unref(BngOnUiNav_default),()=>{},`rotate_h_cam,rotate_v_cam`]])}},GridSelector_default=__plugin_vue_export_helper_default(_sfc_main$311,[[`__scopeId`,`data-v-d340d12f`]]),_hoisted_1$277={class:`details`,"bng-nav-scroll":``},_hoisted_2$228={key:0,class:`preview`},_hoisted_3$202={key:1,class:`content-header`},_hoisted_4$173={key:0,class:`description`},_hoisted_5$149={key:0,class:`specs-grid`},_hoisted_6$128={class:`specs-grid-container`},_hoisted_7$114={class:`spec-content`},_hoisted_8$95={class:`spec-label`},_hoisted_9$85={class:`spec-value`},_hoisted_10$74={key:2,class:`buttons-section`},_sfc_main$310={__name:`AppDetails`,props:{activeItem:{type:Object,default:null},activeItemDetails:{type:Object,default:null},executeButton:{type:Function,required:!0},toggleFavourite:{type:Function,required:!0}},setup(__props){let props=__props,handleButtonClick=buttonId=>{props.executeButton(buttonId)};return(_ctx,_cache)=>withDirectives((openBlock(),createElementBlock(`div`,_hoisted_1$277,[__props.activeItemDetails?.preview?(openBlock(),createElementBlock(`div`,_hoisted_2$228,[createVNode(unref(aspectRatio_default),{class:`preview-image`,ratio:`16:8`,"external-image":__props.activeItemDetails.preview},null,8,[`external-image`])])):createCommentVNode(``,!0),__props.activeItemDetails?.headerTitle?(openBlock(),createElementBlock(`div`,_hoisted_3$202,[__props.activeItemDetails?.description?(openBlock(),createElementBlock(`div`,_hoisted_4$173,toDisplayString(__props.activeItemDetails.description),1)):createCommentVNode(``,!0)])):createCommentVNode(``,!0),(openBlock(!0),createElementBlock(Fragment,null,renderList(__props.activeItemDetails?.specifications,(specList,specListIndex)=>(openBlock(),createElementBlock(Fragment,{key:specListIndex},[specList.length>0?(openBlock(),createElementBlock(`div`,_hoisted_5$149,[createBaseVNode(`div`,_hoisted_6$128,[(openBlock(!0),createElementBlock(Fragment,null,renderList(specList,specification=>(openBlock(),createElementBlock(`div`,{key:specification.key,class:`spec-cell`},[specification.icon?(openBlock(),createBlock(unref(bngIcon_default),{key:0,type:specification.icon,class:`spec-icon`},null,8,[`type`])):createCommentVNode(``,!0),createBaseVNode(`div`,_hoisted_7$114,[createBaseVNode(`div`,_hoisted_8$95,toDisplayString(specification.label)+`:`,1),createBaseVNode(`div`,_hoisted_9$85,[createBaseVNode(`span`,null,toDisplayString(specification.value),1)])])]))),128))])])):createCommentVNode(``,!0)],64))),128)),__props.activeItemDetails?.buttonInfo?.length>0?(openBlock(),createElementBlock(`div`,_hoisted_10$74,[(openBlock(!0),createElementBlock(Fragment,null,renderList(__props.activeItemDetails.buttonInfo,button=>(openBlock(),createBlock(unref(bngButton_default),{key:button.buttonId,"bng-scoped-nav-autofocus":button.primary,accent:button.primary?`main`:`secondary`,label:button.label,icon:button.icon,onClick:$event=>handleButtonClick(button.buttonId)},null,8,[`bng-scoped-nav-autofocus`,`accent`,`label`,`icon`,`onClick`]))),128))])):createCommentVNode(``,!0)])),[[unref(BngUiNavScroll_default),void 0,void 0,{force:!0}]])}},AppDetails_default=__plugin_vue_export_helper_default(_sfc_main$310,[[`__scopeId`,`data-v-c8fb13f2`]]),_sfc_main$309={__name:`AppSelector`,setup(__props){return(_ctx,_cache)=>(openBlock(),createBlock(GridSelector_default,{backendName:`appSelector`,routePath:`/app-selector`,defaultPath:{keys:[`allApps`]},defaultDetailsMode:`advanced`},{"item-details":withCtx(({activeItem,activeItemDetails,executeButton,toggleFavourite})=>[createVNode(AppDetails_default,{activeItem,activeItemDetails,executeButton,toggleFavourite},null,8,[`activeItem`,`activeItemDetails`,`executeButton`,`toggleFavourite`])]),_:1}))}},AppSelector_default=_sfc_main$309,routes_default=[{name:`menu.appselector`,path:`/app-selector/:pathMatch(.*)*`,component:AppSelector_default,props:!0,meta:{clickThrough:!1,infoBar:{visible:!0,showSysInfo:!1},uiApps:{shown:!1},topBar:{visible:!0}}},{name:`menu.appedit`,path:`/app-edit/`,component:NotFound_default,meta:{clickThrough:!0,infoBar:{visible:!0,showSysInfo:!1},uiApps:{shown:!0},topBar:{visible:!0}}}],_hoisted_1$276={class:`main-info`},_hoisted_2$227={class:`heading`},_hoisted_3$201={key:0,class:`stars`},_hoisted_4$172={key:1,class:`aggregate-primary`},_hoisted_5$148={class:`label`},_hoisted_6$127={class:`value`},_hoisted_7$113={key:2,class:`empty-gap`},_sfc_main$308={__name:`PoiCard`,props:{poi:{type:Object,required:!0},shown:{type:Boolean,default:!0}},emits:[`select`,`hover`],setup(__props,{emit:__emit}){let debugLog$1=(message,data)=>{},props=__props,emit$1=__emit,onSelect=()=>{props.poi.id,props.poi.name,emit$1(`select`,props.poi.id)},thumbLoaded=props.shown&&!!props.poi?.thumbnail,thumbShown=ref(thumbLoaded),thumb=ref(thumbLoaded?`url("${props.poi?.thumbnail}")`:`none`),lastThumb=thumbLoaded?props.poi?.thumbnail:void 0;return watch([()=>props.shown,()=>props.poi],()=>{if(props.shown&&props.poi?.thumbnail){let url=props.poi.thumbnail;if(lastThumb!==url){lastThumb=url,thumbLoaded=!1;let img=new Image;img.src=url,img.onload=()=>{lastThumb===url&&(thumbLoaded=!0,thumb.value=`url("${url}")`,thumbShown.value=!0)}}}else props.poi?.thumbnail||(lastThumb=void 0,thumbLoaded=!1,thumb.value=`none`,thumbShown.value=!1)},{immediate:!0}),(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,{class:normalizeClass([`poi-item`,{highlighted:__props.poi.isSelected}]),onClick:onSelect,"bng-nav-item":``},[createBaseVNode(`div`,{class:normalizeClass([`card-info`,{"content-shown":__props.shown,"thumb-show":thumbShown.value&&!!thumb.value}]),style:normalizeStyle({"--poi-image":thumb.value})},[__props.poi.icon?(openBlock(),createBlock(unref(bngIcon_default),{key:0,class:`mission-icon`,type:__props.poi.icon,color:`white`},null,8,[`type`])):createCommentVNode(``,!0),createBaseVNode(`div`,_hoisted_1$276,[createBaseVNode(`div`,_hoisted_2$227,toDisplayString(__props.poi.name),1),__props.poi.formattedProgress?(openBlock(),createElementBlock(`div`,_hoisted_3$201,[__props.poi.formattedProgress.unlockedStars?(openBlock(),createBlock(unref(bngMainStars_default),{key:0,"individual-stars":__props.poi.formattedProgress.unlockedStars.defaults,class:`main-stars`,scale:.6,reverse:``},null,8,[`individual-stars`])):createCommentVNode(``,!0),__props.poi.formattedProgress.unlockedStars&&__props.poi.formattedProgress.unlockedStars.totalBonusStarCount>0?(openBlock(),createBlock(unref(bngMainStars_default),{key:1,"individual-stars":__props.poi.formattedProgress.unlockedStars.bonus,class:`bonus-stars`,scale:.6},null,8,[`individual-stars`])):createCommentVNode(``,!0)])):__props.poi.aggregatePrimary?(openBlock(),createElementBlock(`div`,_hoisted_4$172,[createBaseVNode(`span`,_hoisted_5$148,toDisplayString(__props.poi.aggregatePrimary.label)+`:`,1),createBaseVNode(`span`,_hoisted_6$127,toDisplayString(__props.poi.aggregatePrimary.value),1)])):(openBlock(),createElementBlock(`div`,_hoisted_7$113))]),createVNode(unref(bngBinding_default),{class:`input-icon`,"ui-event":`ok`,controller:``})],6)],2))}},PoiCard_default=__plugin_vue_export_helper_default(_sfc_main$308,[[`__scopeId`,`data-v-cd49bd11`]]),_hoisted_1$275={class:`poi-list`},_hoisted_2$226={class:`filter-header`},_hoisted_3$200={class:`poi-list-items`},_sfc_main$307={__name:`PoiList`,props:{store:{type:Object,required:!0}},setup(__props){let props=__props,poiListContainer=ref(null),shownCards=ref(new Set),{groupData,poiData,selectedPoi,selectPoi,onHover,debugLog:debugLog$1}=props.store,processedPoiData=computed(()=>{let processed={};if(!poiData.value)return processed;for(let[poiId,poi]of Object.entries(poiData.value))poi&&(processed[poiId]={id:poi.id||poiId,name:poi.name?$translate.instant(poi.name):``,icon:poi.icon?icons[poi.icon]:icons._empty,thumbnail:poi.thumbnailFile,formattedProgress:poi.formattedProgress,aggregatePrimary:poi.aggregatePrimary?.label&&poi.aggregatePrimary?.value?{label:$translate.instant(poi.aggregatePrimary.label),value:$translate.instant(poi.aggregatePrimary.value)}:null,isSelected:selectedPoi.value?.id===poi.id});return processed});debugLog$1(`PoiList`,`Component initialized`,{groupDataCount:groupData.value?.length||0,poiDataCount:Object.keys(poiData.value||{}).length,processedPoiCount:Object.keys(processedPoiData.value).length});let observer$2=new IntersectionObserver(entries=>{for(let entry of entries){let poiId=entry.target.getAttribute(`data-poi-id`);poiId&&entry.isIntersecting?shownCards.value.add(poiId):shownCards.value.delete(poiId)}},{threshold:.1,rootMargin:`10px`}),setupObserver=()=>{if(!poiListContainer.value)return;let elms$4=poiListContainer.value.querySelectorAll(`[data-poi-id]`),ids=[];for(let elm of elms$4){let poiId=elm.getAttribute(`data-poi-id`);poiId&&(ids.push(poiId),observer$2.observe(elm))}for(let id of shownCards.value)ids.includes(id)||shownCards.value.delete(id)};return watch(poiListContainer,cont=>cont&&nextTick(setupObserver),{immediate:!0}),watch([groupData,processedPoiData],()=>{nextTick(()=>{observer$2.disconnect(),setupObserver()})},{immediate:!1}),onUnmounted(()=>{shownCards.value.clear(),observer$2.disconnect()}),(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$275,[createBaseVNode(`div`,{class:`poi-list-content`,ref_key:`poiListContainer`,ref:poiListContainer},[(openBlock(!0),createElementBlock(Fragment,null,renderList(unref(groupData),section=>(openBlock(),createElementBlock(`div`,{key:section.key,class:`filter-section`},[createBaseVNode(`div`,_hoisted_2$226,[createVNode(unref(bngIcon_default),{type:section.icon},null,8,[`type`]),createBaseVNode(`span`,null,toDisplayString(section.title?_ctx.$tt(section.title):``),1)]),(openBlock(!0),createElementBlock(Fragment,null,renderList(section.groups,group=>(openBlock(),createElementBlock(`div`,{key:group.key,class:`mission-group`},[createVNode(unref(bngCardHeading_default),{class:`mission-group-header`,type:`ribbon`,outline:``},{default:withCtx(()=>[createTextVNode(toDisplayString(_ctx.$t(group.label)),1)]),_:2},1024),createBaseVNode(`div`,_hoisted_3$200,[(openBlock(!0),createElementBlock(Fragment,null,renderList(group.elementIds,poiId=>(openBlock(),createBlock(PoiCard_default,{key:poiId,"data-poi-id":poiId,shown:shownCards.value.has(poiId),poi:processedPoiData.value[poiId],onSelect:unref(selectPoi),onHover:unref(onHover)},null,8,[`data-poi-id`,`shown`,`poi`,`onSelect`,`onHover`]))),128))])]))),128))]))),128))],512)]))}},PoiList_default=__plugin_vue_export_helper_default(_sfc_main$307,[[`__scopeId`,`data-v-0ccba230`]]),_hoisted_1$274={class:`header`},_sfc_main$306={__name:`bngAdvCardHeading`,props:{blurDelay:Number,preheadings:Array,divider:Boolean,icon:String,type:{type:String,default:`line`,validator:v=>[`line`,`ribbon`].includes(v)||v===``}},setup(__props){let blurVal=ref(!1);onMounted(()=>window.setTimeout(()=>blurVal.value=!0,~~+props.blurDelay));let props=__props;return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,{class:normalizeClass([`bng-screen-header`,{[`heading-style-${__props.type}`]:!0,prehead:__props.preheadings}])},[_cache[0]||=createBaseVNode(`div`,{class:`decorator`},null,-1),__props.preheadings?(openBlock(),createElementBlock(`span`,{key:0,class:normalizeClass([`pre-header`,{"with-divider":__props.divider}])},[__props.icon?(openBlock(),createBlock(unref(bngIcon_default),{key:0,type:__props.icon,class:`pre-header-icon`},null,8,[`type`])):createCommentVNode(``,!0),(openBlock(!0),createElementBlock(Fragment,null,renderList(__props.preheadings,preheading=>(openBlock(),createElementBlock(`span`,{class:`location`,key:preheading},toDisplayString(preheading),1))),128))],2)):createCommentVNode(``,!0),createBaseVNode(`h1`,_hoisted_1$274,[renderSlot(_ctx.$slots,`default`,{},void 0,!0)])],2))}},bngAdvCardHeading_default=__plugin_vue_export_helper_default(_sfc_main$306,[[`__scopeId`,`data-v-16619e8d`]]),_hoisted_1$273={key:0,class:`poi-icons`},_hoisted_2$225=[`onClick`],_hoisted_3$199={key:1,class:`poi-details`},_hoisted_4$171={class:`poi-content`},_hoisted_5$147={class:`poi-scrollable`},_hoisted_6$126={key:0,class:`poi-aggregate-display`},_hoisted_7$112={key:0,class:`poi-stars`},_hoisted_8$94={class:`stars`},_hoisted_9$84={key:1,class:`aggregate-primary`},_hoisted_10$73={class:`label`},_hoisted_11$66={class:`value`},_hoisted_12$54={key:1,class:`poi-description`},_hoisted_13$47={class:`poi-actions`},_sfc_main$305={__name:`PoiDetails`,props:{store:{type:Object,required:!0}},emits:[`setRoute`,`teleport`],setup(__props,{emit:__emit}){let props=__props,{selectedPoi,selectedPoiIds,poiData,debugLog:debugLog$1}=props.store;debugLog$1(`PoiDetails`,`Component initialized`,{selectedPoiId:selectedPoi.value?.id,selectedPoiIdsCount:selectedPoiIds.value?.length||0});let selectedPoisList=computed(()=>{if(!selectedPoiIds.value||selectedPoiIds.value.length===0)return selectedPoi.value?[selectedPoi.value]:[];let pois=[];for(let poiId of selectedPoiIds.value){let poi=poiData.value[poiId];poi&&pois.push(poi)}return debugLog$1(`PoiDetails`,`Final pois list`,pois),pois}),currentPoiIndex=computed(()=>{if(selectedPoisList.value.length<=1)return 0;let index=selectedPoisList.value.findIndex(poi=>poi.id===selectedPoi.value?.id);return index>=0?index:0}),selectPoi=index=>{index>=0&&index{let headings=[];return selectedPoi.value?.label&&headings.push($translate.instant(selectedPoi.value.label)),headings}),preview=computed(()=>selectedPoi.value?.previewFiles?.length>0?selectedPoi.value.previewFiles[0]:selectedPoi.value?.thumbnailFile||null),safeTranslate=key=>{if(!key)return``;try{return typeof key==`string`?$translate.instant(key):(typeof key==`object`&&key.txt,$translate.contextTranslate(key))}catch(e){return console.warn(`Translation failed for key:`,key,e),typeof key==`string`?key:key?.txt||``}},aggregatePrimary=computed(()=>{let poi=selectedPoi.value;return poi?.aggregatePrimary?.label&&poi?.aggregatePrimary?.value?poi.aggregatePrimary:null}),onAction=action=>{props.store.executePoiAction(action.actionId)};return(_ctx,_cache)=>(openBlock(),createElementBlock(Fragment,null,[selectedPoisList.value.length>=1?withDirectives((openBlock(),createElementBlock(`div`,_hoisted_1$273,[(openBlock(!0),createElementBlock(Fragment,null,renderList(selectedPoisList.value,(poi,index)=>(openBlock(),createElementBlock(`div`,{key:poi.id||index,class:normalizeClass([`poi-icon`,{active:index===currentPoiIndex.value}]),onClick:$event=>selectPoi(index)},[createVNode(unref(bngSpriteIcon_default),{src:`map_`+poi.spriteIcon,style:{width:`100%`,height:`100%`}},null,8,[`src`])],10,_hoisted_2$225))),128))])),[[unref(BngBlur_default),!0]]):createCommentVNode(``,!0),unref(selectedPoi)?withDirectives((openBlock(),createElementBlock(`div`,_hoisted_3$199,[createBaseVNode(`div`,_hoisted_4$171,[createVNode(bngAdvCardHeading_default,{class:`poi-details-header`,type:`line`,preheadings:preheadings.value},{default:withCtx(()=>[createTextVNode(toDisplayString(safeTranslate(unref(selectedPoi).name)),1)]),_:1},8,[`preheadings`]),createBaseVNode(`div`,_hoisted_5$147,[preview.value?(openBlock(),createBlock(aspectRatio_default,{key:0,class:`poi-thumbnail`,ratio:`16:9`,externalImage:preview.value,imageMode:`cover`},{default:withCtx(()=>[aggregatePrimary.value||unref(selectedPoi).formattedProgress?(openBlock(),createElementBlock(`div`,_hoisted_6$126,[unref(selectedPoi).formattedProgress?(openBlock(),createElementBlock(`div`,_hoisted_7$112,[createBaseVNode(`div`,_hoisted_8$94,[unref(selectedPoi).formattedProgress.unlockedStars?(openBlock(),createBlock(unref(bngMainStars_default),{key:0,individualStars:unref(selectedPoi).formattedProgress.unlockedStars.defaults,class:`main-stars`,scale:.8,reverse:``},null,8,[`individualStars`])):createCommentVNode(``,!0),unref(selectedPoi).formattedProgress.unlockedStars&&unref(selectedPoi).formattedProgress.unlockedStars.totalBonusStarCount>0?(openBlock(),createBlock(unref(bngMainStars_default),{key:1,individualStars:unref(selectedPoi).formattedProgress.unlockedStars.bonus,class:`bonus-stars`,scale:.8},null,8,[`individualStars`])):createCommentVNode(``,!0)])])):aggregatePrimary.value?(openBlock(),createElementBlock(`div`,_hoisted_9$84,[createBaseVNode(`span`,_hoisted_10$73,toDisplayString(_ctx.$t(aggregatePrimary.value.label))+`:`,1),createBaseVNode(`span`,_hoisted_11$66,toDisplayString(_ctx.$t(aggregatePrimary.value.value)),1)])):createCommentVNode(``,!0)])):createCommentVNode(``,!0)]),_:1},8,[`externalImage`])):createCommentVNode(``,!0),unref(selectedPoi).description?(openBlock(),createElementBlock(`div`,_hoisted_12$54,toDisplayString(safeTranslate(unref(selectedPoi).description)),1)):createCommentVNode(``,!0)]),createBaseVNode(`div`,_hoisted_13$47,[(openBlock(!0),createElementBlock(Fragment,null,renderList(unref(selectedPoi).actions,action=>(openBlock(),createBlock(unref(bngButton_default),{key:action.id,accent:unref(ACCENTS).secondary,"icon-right":action.icon,label:action.label,onClick:$event=>onAction(action)},null,8,[`accent`,`icon-right`,`label`,`onClick`]))),128))])])])),[[unref(BngBlur_default),!0]]):createCommentVNode(``,!0)],64))}},PoiDetails_default=__plugin_vue_export_helper_default(_sfc_main$305,[[`__scopeId`,`data-v-35e47e7e`]]),_hoisted_1$272={class:`poi-filters`},_hoisted_2$224={key:0,class:`filter-row`},_hoisted_3$198=[`onClick`],_hoisted_4$170=[`onClick`],_sfc_main$304={__name:`PoiFilters`,props:{store:{type:Object,required:!0}},setup(__props){let props=__props,{filterData,debugLog:debugLog$1}=props.store;debugLog$1(`PoiFilters`,`Component initialized`,{filterDataCount:filterData.value?.length||0});let getGroupVisualState=(filter,group)=>{if(!filter||!group||!filter.groups||!Array.isArray(filter.groups))return`inactive`;let visibleGroups=0,totalGroups=0;for(let filterGroup of filter.groups)filterGroup&&filterGroup.elementCount>0&&(totalGroups++,filterGroup.visible&&visibleGroups++);let isAllGroupsActive=visibleGroups===totalGroups,isGroupActive=group.visible;return isAllGroupsActive?`neutral`:isGroupActive?`active`:`inactive`},getGroupColor=(filter,group)=>{switch(getGroupVisualState(filter,group)){case`neutral`:return`var(--bng-off-white)`;case`active`:return`var(--bng-add-green-100)`;case`inactive`:default:return`var(--bng-add-red-300)`}},hasActiveFilters=filter=>{if(!filter||!filter.groups||!Array.isArray(filter.groups))return!1;let visibleGroups=0,totalGroups=0;for(let group of filter.groups)group&&group.elementCount>0&&(totalGroups++,group.visible&&visibleGroups++);return visibleGroups{debugLog$1(`PoiFilters`,`Toggling group visibility`,groupKey),props.store.toggleGroupVisibility(groupKey)},toggleFilterSectionVisibility=filterKey=>{debugLog$1(`PoiFilters`,`Toggling filter section visibility`,filterKey),props.store.toggleFilterSectionVisibility(filterKey)};return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$272,[(openBlock(!0),createElementBlock(Fragment,null,renderList(unref(filterData),filterSection=>(openBlock(),createElementBlock(Fragment,{key:filterSection.key},[filterSection&&filterSection.groups?withDirectives((openBlock(),createElementBlock(`div`,_hoisted_2$224,[createBaseVNode(`div`,{class:normalizeClass([`filter-icon`,{"has-active-filters":hasActiveFilters(filterSection)}]),onClick:$event=>toggleFilterSectionVisibility(filterSection.key)},[createVNode(bngTooltip_default,{text:_ctx.$tt(filterSection.title)},{default:withCtx(()=>[createVNode(unref(bngIcon_default),{type:filterSection.icon},null,8,[`type`])]),_:2},1032,[`text`])],10,_hoisted_3$198),_cache[0]||=createBaseVNode(`div`,{class:`filter-separator`},null,-1),(openBlock(!0),createElementBlock(Fragment,null,renderList(filterSection.groups,group=>(openBlock(),createElementBlock(Fragment,{key:group.key},[group&&group.elementCount>0?(openBlock(),createElementBlock(`div`,{key:0,class:normalizeClass([`filter-group`,{inactive:!group.visible}]),onClick:$event=>toggleGroupVisibility(group.key)},[createVNode(bngTooltip_default,{text:_ctx.$tt(group.label)+` ×`+group.elementCount},{default:withCtx(()=>[createVNode(unref(bngIcon_default),{type:group.icon||`info`,color:getGroupColor(filterSection,group)},null,8,[`type`,`color`])]),_:2},1032,[`text`])],10,_hoisted_4$170)):createCommentVNode(``,!0)],64))),128))])),[[unref(BngBlur_default),!0]]):createCommentVNode(``,!0)],64))),128))]))}},PoiFilters_default=__plugin_vue_export_helper_default(_sfc_main$304,[[`__scopeId`,`data-v-43aa27ac`]]);const debugLog=(component,message,data)=>{};function useBigMap(){let selectedPoi=ref(null),selectedPoiIds=ref([]),filterData=ref([]),groupData=ref([]),poiData=ref({}),gameMode=ref(``),levelData=ref({title:``}),isPoiListVisible=ref(!1),isDetailsVisible=ref(!1),{events:events$3}=useBridge(),translatedPreheadings=computed(()=>{let preheadings=[];return gameMode.value&&preheadings.push($translate.instant(`ui.playmodes.${gameMode.value}`)),levelData.value?.title&&preheadings.push($translate.instant(levelData.value.title)),preheadings}),currentFilterTitle=computed(()=>$translate.instant(`bigMap.sideMenu.pois`)),getStaticDataFromLua=async()=>{try{poiData.value=await Lua_default.freeroam_vueBigMap.getPoiData()||{};let gameStateResult=await Lua_default.freeroam_vueBigMap.getGameStateInfo();gameStateResult&&(gameMode.value=gameStateResult.gameMode||``,levelData.value=gameStateResult.levelData||{title:``}),poiData.value,gameMode.value}catch(error){console.error(`Error getting static data from Lua:`,error)}},getDynamicDataFromLua=async()=>{try{filterData.value=await Lua_default.freeroam_vueBigMap.getFilters()||[],groupData.value=await Lua_default.freeroam_vueBigMap.getGroups()||[],filterData.value,groupData.value}catch(error){console.error(`Error getting dynamic data from Lua:`,error)}},handleShowPoiDetails=data=>{let poiIds=data?.poiIds||[];if(selectedPoiIds.value=poiIds,poiIds.length===0){selectedPoi.value=null,isDetailsVisible.value=!1;return}let selectedPoiId=poiIds[0];selectedPoiId&&poiData.value[selectedPoiId]?(selectedPoi.value=poiData.value[selectedPoiId],isDetailsVisible.value=!0):(selectedPoi.value=null,isDetailsVisible.value=!1)},toggleGroupVisibility=async groupKey=>{try{let filterIds=[groupKey];await Lua_default.freeroam_vueBigMap.toggleFiltersByIds(filterIds),await getDynamicDataFromLua()}catch(error){console.error(`Error toggling group visibility:`,error)}},toggleFilterSectionVisibility=async filterKey=>{try{await Lua_default.freeroam_vueBigMap.toggleFilterSectionById(filterKey),await getDynamicDataFromLua()}catch(error){console.error(`Error toggling filter visibility:`,error)}},selectPoi=async poiId=>{try{let result=await Lua_default.freeroam_vueBigMap.selectPoiFromList(poiId);result===`success`?poiId?(selectedPoi.value=poiData.value[poiId],isDetailsVisible.value=!0):(selectedPoi.value=null,isDetailsVisible.value=!1):console.error(`Failed to select POI:`,result)}catch(error){console.error(`Error selecting POI:`,error)}};return{selectedPoi,selectedPoiIds,filterData,groupData,poiData,gameMode,levelData,isPoiListVisible,isDetailsVisible,translatedPreheadings,currentFilterTitle,initialize:async()=>{try{await Lua_default.freeroam_vueBigMap.enterBigMap(),await getStaticDataFromLua(),await getDynamicDataFromLua(),events$3.on(`showPoiDetails`,handleShowPoiDetails)}catch(error){console.error(`Error initializing bigmap:`,error)}},cleanup:async()=>{try{await Lua_default.freeroam_vueBigMap.exitBigMap(),events$3.off(`showPoiDetails`)}catch(error){console.error(`Error cleaning up bigmap:`,error)}},selectPoi,showPoiList:()=>{isPoiListVisible.value=!0},hidePoiList:()=>{isPoiListVisible.value=!1,selectedPoi.value&&selectPoi(null)},onHover:async(poiId,active)=>{try{await Lua_default.freeroam_vueBigMap.hoverPoiFromList(poiId,active)}catch(error){console.error(`Error hovering POI:`,error)}},executePoiAction:async actionId=>{try{await Lua_default.freeroam_vueBigMap.executePoiAction(actionId)}catch(error){console.error(`Error executing POI action:`,error)}},toggleGroupVisibility,toggleFilterSectionVisibility,debugLog}}var _hoisted_1$271={class:`bigmap-container`},_hoisted_2$223={class:`bigmap-content`},_hoisted_3$197={class:`bigmap-left-content`},_hoisted_4$169={class:`bigmap-poilist-outline`},_hoisted_5$146={key:0,class:`bigmap-details-outline`},_sfc_main$303={__name:`BigMap`,setup(__props){let store$1=useBigMap(),{isPoiListVisible,isDetailsVisible,translatedPreheadings,currentFilterTitle,onSetRoute,onTeleport,toggleGroupVisibility,initialize,cleanup,debugLog:debugLog$1}=store$1,handleToggleGroupVisibility=groupKey=>{debugLog$1(`BigMap`,`Toggle group visibility`,groupKey),toggleGroupVisibility(groupKey)};return onMounted(()=>{debugLog$1(`BigMap`,`Component mounted, initializing bigmap`),initialize()}),onUnmounted(()=>{debugLog$1(`BigMap`,`Component unmounted, cleaning up bigmap`),cleanup()}),(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$271,[createVNode(unref(bngScreenHeading_default),{class:`bigmap-heading`,preheadings:unref(translatedPreheadings),divider:!0,type:`line`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(currentFilterTitle)),1)]),_:1},8,[`preheadings`]),createBaseVNode(`div`,_hoisted_2$223,[createBaseVNode(`div`,_hoisted_3$197,[createVNode(PoiFilters_default,{store:unref(store$1),onToggleGroupVisibility:handleToggleGroupVisibility},null,8,[`store`]),createBaseVNode(`div`,_hoisted_4$169,[createVNode(unref(bngDrawer_default),{modelValue:unref(isPoiListVisible),"onUpdate:modelValue":_cache[0]||=$event=>isRef(isPoiListVisible)?isPoiListVisible.value=$event:null,position:`left`,blur:``,header:_ctx.$tt(`bigMap.sideMenu.pois`)},{default:withCtx(()=>[createVNode(PoiList_default,{class:`bigmap-poilist`,store:unref(store$1)},null,8,[`store`])]),_:1},8,[`modelValue`,`header`])])]),_cache[1]||=createBaseVNode(`div`,{class:`bigmap-center-outline`},null,-1),unref(isDetailsVisible)?(openBlock(),createElementBlock(`div`,_hoisted_5$146,[createVNode(PoiDetails_default,{store:unref(store$1),onSetRoute:unref(onSetRoute),onTeleport:unref(onTeleport)},null,8,[`store`,`onSetRoute`,`onTeleport`])])):createCommentVNode(``,!0)])]))}},BigMap_default=__plugin_vue_export_helper_default(_sfc_main$303,[[`__scopeId`,`data-v-e6716bb0`]]),_hoisted_1$270={class:`bigmap-view`},_sfc_main$302={__name:`BigMapView`,setup(__props){return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$270,[createVNode(BigMap_default)]))}},BigMapView_default=__plugin_vue_export_helper_default(_sfc_main$302,[[`__scopeId`,`data-v-044f4742`]]),routes_default$1=[{path:`/bigmap`,name:`bigmap`,component:BigMapView_default,meta:{uiApps:{shown:!1},infoBar:{visible:!0,showSysInfo:!0}}}],_hoisted_1$269={class:`progress-steps`},_hoisted_2$222={class:`step-container`},_hoisted_3$196={class:`step-header`},_hoisted_4$168={class:`step-number`},_hoisted_5$145={class:`step-icon`},_hoisted_6$125={class:`step-label`},_sfc_main$301={__name:`ProgressSteps`,props:{steps:{type:Array,required:!0,validator:steps=>steps.every(step=>step.label&&typeof step.label==`string`||step.title&&typeof step.title==`string`)},currentStep:{type:Number,required:!0,validator:step=>step>=0}},setup(__props){let props=__props,styles={answeredYes:{class:`answered-yes`,icon:`checkboxOn`},answeredNo:{class:`answered-no`,icon:`missionCheckboxCross`},current:{class:`not-answered current`,icon:`arrowLargeRight`},next:{class:`not-answered`,icon:`checkboxOff`}},steps=computed(()=>props.steps.map((step,idx)=>{let answer=step.isAnswered?step.answerType||`yes`:null,status=`next`;return idx(openBlock(),createElementBlock(`div`,_hoisted_1$269,[createBaseVNode(`div`,_hoisted_2$222,[(openBlock(!0),createElementBlock(Fragment,null,renderList(steps.value,(step,index)=>(openBlock(),createElementBlock(`div`,{key:index,class:normalizeClass([`step`,step.class])},[createBaseVNode(`div`,_hoisted_3$196,[createBaseVNode(`div`,_hoisted_4$168,toDisplayString(index+1),1),step.isLastStep?createCommentVNode(``,!0):(openBlock(),createElementBlock(Fragment,{key:0},[_cache[0]||=createBaseVNode(`div`,{class:`step-connector`},null,-1),createBaseVNode(`div`,_hoisted_5$145,[createVNode(unref(bngIcon_default),{type:step.icon},null,8,[`type`])])],64))]),createBaseVNode(`div`,_hoisted_6$125,toDisplayString(_ctx.$tt(step.label)),1)],2))),128))])]))}},ProgressSteps_default=__plugin_vue_export_helper_default(_sfc_main$301,[[`__scopeId`,`data-v-d5d29cd2`]]);function useWizard(options={}){let{allowSkip=!1,validateSteps=!0}=options,stepRegistry=ref(new Map),currentStepIndex=ref(0),completedSteps=ref(new Set),isFinished=ref(!1),steps=computed(()=>{if(stepRegistry.value.size===0)return[];let res=Array.from(stepRegistry.value.values());for(let step of res)if(!(!step.enabledWhen||step.enabledWhen.length===0)){for(let condition of step.enabledWhen)if(condition.step){let dependencyStep=res.find(s=>s.id===condition.step);if(!dependencyStep)continue;dependencyStep.requiredFor||=[],dependencyStep.requiredFor.includes(step.id)||dependencyStep.requiredFor.push(step.id)}}return res}),registerStep=stepConfig=>stepRegistry.value.set(stepConfig.id,stepConfig),unregisterStep=stepId=>stepRegistry.value.delete(stepId);provide(`registerWizardStep`,registerStep),provide(`unregisterWizardStep`,unregisterStep);let currentStep=computed(()=>steps.value[currentStepIndex.value]||null),isFirstStep=computed(()=>currentStepIndex.value===0),isLastStep=computed(()=>currentStepIndex.value===steps.value.length-1),canGoNext=computed(()=>{if(!validateSteps)return!0;let step=currentStep.value;return!step||!isStepEnabled(step)||step.advanceDisabled?!1:typeof step.validate==`function`?step.validate(step.modelValue||{}):step.type===`choice`&&step.required!==!1?step.modelValue?.choice!==void 0:(step.type,!0)}),isStepEnabled=step=>!step.enabledWhen||step.enabledWhen.length===0?!0:step.enabledWhen.every(condition=>{if(condition.step){let dependencyStepData=steps.value.find(s=>s.id===condition.step)?.modelValue||{};if(condition.value!==void 0)return dependencyStepData?.choice===condition.value||dependencyStepData?.[Object.keys(dependencyStepData)[0]]===condition.value;if(typeof condition.condition==`function`)return condition.condition(dependencyStepData)}return typeof condition.condition==`function`?condition.condition():!0}),canGoBack=computed(()=>!isFirstStep.value),canFinish=computed(()=>validateSteps?isLastStep.value&&canGoNext.value:isLastStep.value),goToStep=index=>{index<=0&&(currentStepIndex.value=0),index>=steps.value.length&&(currentStepIndex.value=steps.value.length-1),currentStepIndex.value=index},nextStep=async()=>{if(await nextTick(),!canGoNext.value)return!1;if(currentStep.value&&completedSteps.value.add(currentStepIndex.value),isLastStep.value)return!0;for(currentStepIndex.value++;currentStepIndex.value=steps.value.length&&(currentStepIndex.value=steps.value.length-1),!0};return{currentStepIndex,currentStep,completedSteps,isFinished,steps,stepRegistry,isFirstStep,isLastStep,canGoNext,canGoBack,canFinish,progress:computed(()=>steps.value.length===0?0:Math.round((currentStepIndex.value+1)/steps.value.length*100)),stepProgress:computed(()=>steps.value.map((step,index)=>{let data=step.modelValue||{},choiceAnalysis=null;if(step.type===`choice`&&step.choices&&data.choice!==void 0){let selectedChoice=step.choices.find(c=>c.value===data.choice),yesChoice=step.choices.find(c=>c.isYes),noChoice=step.choices.find(c=>c.isNo),answerType=null;selectedChoice&&(answerType=selectedChoice.isYes||yesChoice&&selectedChoice.value===yesChoice.value?`yes`:selectedChoice.isNo||noChoice&&selectedChoice.value===noChoice.value?`no`:!yesChoice&&!noChoice?`yes`:step.choices.length===2&&!selectedChoice.isYes&&!selectedChoice.isNo?`no`:`yes`),choiceAnalysis={selectedValue:data.choice,selectedChoice,answerType,hasYesFlag:!!yesChoice,hasNoFlag:!!noChoice}}return{...step,index,isCompleted:completedSteps.value.has(index),isCurrent:index===currentStepIndex.value,isAccessible:index<=currentStepIndex.value,isEnabled:isStepEnabled(step),data,hasData:Object.keys(data).length>0,isAnswered:step.type===`choice`?data.choice!==void 0:Object.keys(data).length>0,answerType:choiceAnalysis?.answerType||null,choiceAnalysis}})),goToStep,nextStep,previousStep:async()=>{if(await nextTick(),!canGoBack.value)return!1;for(currentStepIndex.value--;currentStepIndex.value>=0;){let targetStep=steps.value[currentStepIndex.value];if(isStepEnabled(targetStep)||targetStep.autoSkip===!1)break;currentStepIndex.value--}return currentStepIndex.value<0&&(currentStepIndex.value=0),!0},finish:()=>canFinish.value?(isFinished.value=!0,{success:!0,completedSteps:Array.from(completedSteps.value)}):{success:!1},reset:()=>{currentStepIndex.value=0,completedSteps.value.clear(),isFinished.value=!1},skip:()=>allowSkip?nextStep():!1,isStepEnabled,registerStep,unregisterStep}}var _hoisted_1$268={class:`wizard-container`},_hoisted_2$221={class:`wizard-content`},_hoisted_3$195={class:`wizard-step-content`},_hoisted_4$167={key:0,class:`wizard-validation`},_hoisted_5$144={class:`validation-message`},_hoisted_6$124={class:`wizard-navigation`},_hoisted_7$111={key:2,class:`switch-buttons`};const wizardProps={wizardOptions:{type:Object,default:()=>({})},title:String,preheadings:Array,showDivider:{type:Boolean,default:!0},showProgress:{type:Boolean,default:!0},showBackButton:{type:Boolean,default:!0},allowSkip:{type:Boolean,default:!1},backButtonText:{type:String,default:`ui.common.back`},nextButtonText:{type:String,default:`ui.common.next`},finishButtonText:{type:String,default:`ui.common.finish`},skipButtonText:{type:String,default:`ui.common.skip`},validationMessage:String};var _sfc_main$300={__name:`Wizard`,props:mergeModels(wizardProps,{modelValue:{default:()=>({})},modelModifiers:{}}),emits:mergeModels([`step-change`,`step-complete`,`wizard-finish`,`validation-error`],[`update:modelValue`]),setup(__props,{expose:__expose,emit:__emit}){let props=__props,modelValue=useModel(__props,`modelValue`),emit$1=__emit,{currentStepIndex,currentStep,isFirstStep,isLastStep,canGoNext,canGoBack,canFinish,progress,stepProgress,nextStep:wizardNextStep,previousStep:wizardPreviousStep,skip:wizardSkip,steps,registerStep:originalRegisterStep}=useWizard({...props.wizardOptions,allowSkip:props.allowSkip}),instance$1=getCurrentInstance(),hasCentralizedModel=computed(()=>!!(instance$1&&instance$1.attrs&&`onUpdate:modelValue`in instance$1.attrs));provide(`currentWizardStep`,currentStep),provide(`wizardNext`,()=>nextStep()),provide(`wizardSteps`,steps),provide(`registerWizardStep`,stepConfig=>hasCentralizedModel.value?originalRegisterStep({...stepConfig,get modelValue(){return modelValue.value?.[stepConfig.id]||{}},updateModelValue:newValue=>{modelValue.value={...modelValue.value,[stepConfig.id]:newValue}}}):originalRegisterStep(stepConfig)),provide(`unregisterWizardStep`,stepId=>{if(hasCentralizedModel.value&&props.modelValue[stepId]){let updatedData={...props.modelValue};delete updatedData[stepId],emit$1(`update:modelValue`,updatedData)}});let currentStepChoices=computed(()=>currentStep.value?.choices||[]),getChoiceButtonClass=(choiceValue,selectedChoice)=>selectedChoice?selectedChoice===choiceValue?`answered-selected`:`answered-not-selected`:`unanswered`,handleChoiceClick=choice=>{currentStep.value?.updateModelValue&&(currentStep.value.updateModelValue({...currentStep.value.modelValue,choice:choice.value}),nextTick(()=>!currentStep.value?.advanceDisabled&&nextStep()))},nextStep=()=>{let stepId=currentStep.value?.id,currentData=currentStep.value?.modelValue||{};emit$1(`step-complete`,{stepId,stepIndex:currentStepIndex.value,step:currentStep.value,data:currentData}),wizardNextStep()&&emit$1(`step-change`,{from:currentStepIndex.value-1,to:currentStepIndex.value,step:currentStep.value})},previousStep=()=>{let prevIndex=currentStepIndex.value;wizardPreviousStep()&&emit$1(`step-change`,{from:prevIndex,to:currentStepIndex.value,step:currentStep.value})},skip=()=>{wizardSkip()&&emit$1(`step-complete`,{stepId:currentStep.value?.id,stepIndex:currentStepIndex.value-1,skipped:!0,data:currentStep.value?.modelValue||{}})},handleFinish=()=>{let allStepData={};steps.value.forEach(step=>{step.modelValue&&Object.keys(step.modelValue).length>0&&(allStepData[step.id]=step.modelValue)}),canFinish.value?emit$1(`wizard-finish`,{success:!0,data:allStepData,completedSteps:Array.from({length:steps.value.length},(_,i)=>i)}):emit$1(`validation-error`,{step:currentStep.value,message:`Cannot finish wizard - validation failed`})};return __expose({currentStepIndex,currentStep,progress,stepProgress,nextStep,previousStep,finish:handleFinish,skip,steps}),(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$268,[createBaseVNode(`div`,_hoisted_2$221,[_ctx.title?(openBlock(),createBlock(unref(bngScreenHeading_default),{key:0,preheadings:_ctx.preheadings,"show-divider":_ctx.showDivider},{default:withCtx(()=>[createTextVNode(toDisplayString(_ctx.$tt(_ctx.title)),1)]),_:1},8,[`preheadings`,`show-divider`])):createCommentVNode(``,!0),_ctx.showProgress?(openBlock(),createBlock(unref(bngCard_default),{key:1,class:`wizard-progress-card`},{default:withCtx(()=>[createVNode(ProgressSteps_default,{steps:unref(stepProgress),"current-step":unref(currentStepIndex)},null,8,[`steps`,`current-step`])]),_:1})):createCommentVNode(``,!0),createVNode(unref(bngCard_default),{class:`wizard-main-card`},{buttons:withCtx(()=>[createBaseVNode(`div`,_hoisted_6$124,[_ctx.showBackButton&&!unref(isFirstStep)?(openBlock(),createBlock(unref(bngButton_default),{key:0,disabled:!unref(canGoBack),accent:unref(ACCENTS).secondary,onClick:previousStep},{default:withCtx(()=>[createTextVNode(toDisplayString(_ctx.$tt(_ctx.backButtonText)),1)]),_:1},8,[`disabled`,`accent`])):createCommentVNode(``,!0),_ctx.allowSkip&&!unref(isLastStep)&&unref(currentStep)?.type!==`choice`?(openBlock(),createBlock(unref(bngButton_default),{key:1,accent:unref(ACCENTS).secondary,onClick:skip},{default:withCtx(()=>[createTextVNode(toDisplayString(_ctx.$tt(_ctx.skipButtonText)),1)]),_:1},8,[`accent`])):createCommentVNode(``,!0),_cache[0]||=createBaseVNode(`div`,{class:`spacer`},null,-1),unref(currentStep)?.type===`choice`?(openBlock(),createElementBlock(`div`,_hoisted_7$111,[(openBlock(!0),createElementBlock(Fragment,null,renderList(currentStepChoices.value,choice=>(openBlock(),createBlock(unref(bngButton_default),{key:choice.value,class:normalizeClass(getChoiceButtonClass(choice.value,unref(currentStep)?.modelValue?.choice||null)),accent:unref(ACCENTS).custom,icon:unref(currentStep)?.modelValue?.choice===choice.value?unref(icons).checkmark:null,disabled:unref(currentStep)?.advanceDisabled,onClick:$event=>handleChoiceClick(choice)},{default:withCtx(()=>[createTextVNode(toDisplayString(_ctx.$tt(choice.label)),1)]),_:2},1032,[`class`,`accent`,`icon`,`disabled`,`onClick`]))),128))])):createCommentVNode(``,!0),!unref(isLastStep)&&unref(currentStep)?.type!==`choice`?(openBlock(),createBlock(unref(bngButton_default),{key:3,disabled:!unref(canGoNext),accent:unref(ACCENTS).primary,onClick:nextStep},{default:withCtx(()=>[createTextVNode(toDisplayString(_ctx.$tt(_ctx.nextButtonText)),1)]),_:1},8,[`disabled`,`accent`])):unref(isLastStep)?(openBlock(),createBlock(unref(bngButton_default),{key:4,disabled:!unref(canFinish),accent:unref(ACCENTS).primary,onClick:handleFinish},{default:withCtx(()=>[createTextVNode(toDisplayString(_ctx.$tt(_ctx.finishButtonText)),1)]),_:1},8,[`disabled`,`accent`])):createCommentVNode(``,!0)])]),default:withCtx(()=>[unref(currentStep)?.title?(openBlock(),createBlock(unref(bngCardHeading_default),{key:0,type:`ribbon`},{default:withCtx(()=>[renderSlot(_ctx.$slots,`step-title`,{step:unref(currentStep)},()=>[createTextVNode(toDisplayString(_ctx.$tt(unref(currentStep).title)),1)],!0)]),_:3})):createCommentVNode(``,!0),withDirectives((openBlock(),createElementBlock(`div`,_hoisted_3$195,[renderSlot(_ctx.$slots,`step`,{step:unref(currentStep),stepData:unref(currentStep)?.modelValue,updateStepData:unref(currentStep)?.updateModelValue,stepIndex:unref(currentStepIndex),isFirst:unref(isFirstStep),isLast:unref(isLastStep)},()=>[renderSlot(_ctx.$slots,`default`,{},void 0,!0)],!0),_ctx.validationMessage?(openBlock(),createElementBlock(`div`,_hoisted_4$167,[createBaseVNode(`div`,_hoisted_5$144,toDisplayString(_ctx.validationMessage),1)])):createCommentVNode(``,!0)])),[[unref(BngUiNavScroll_default)]])]),_:3})])]))}},Wizard_default=__plugin_vue_export_helper_default(_sfc_main$300,[[`__scopeId`,`data-v-69c7b9c4`]]),_sfc_main$299={__name:`WizardView`,props:mergeModels({...wizardProps},{modelValue:{},modelModifiers:{}}),emits:mergeModels([`step-change`,`step-complete`,`wizard-finish`,`validation-error`],[`update:modelValue`]),setup(__props,{expose:__expose}){let props=__props,slots=useSlots(),wizardRef=ref(),wizardModel=useModel(__props,`modelValue`);return __expose({wizard:wizardRef,get currentStepIndex(){return wizardRef.value?.currentStepIndex},get currentStep(){return wizardRef.value?.currentStep},get progress(){return wizardRef.value?.progress},get stepProgress(){return wizardRef.value?.stepProgress},get steps(){return wizardRef.value?.steps},nextStep:()=>wizardRef.value?.nextStep(),previousStep:()=>wizardRef.value?.previousStep(),finish:()=>wizardRef.value?.finish(),skip:()=>wizardRef.value?.skip()}),(_ctx,_cache)=>withDirectives((openBlock(),createBlock(unref(layoutSingle_default),{class:`layout-content-full content-center layout-paddings wizard-view`},{default:withCtx(()=>[createVNode(Wizard_default,mergeProps({ref_key:`wizardRef`,ref:wizardRef},props,{modelValue:wizardModel.value,"onUpdate:modelValue":_cache[0]||=$event=>wizardModel.value=$event,onStepChange:_cache[1]||=$event=>_ctx.$emit(`step-change`,$event),onStepComplete:_cache[2]||=$event=>_ctx.$emit(`step-complete`,$event),onWizardFinish:_cache[3]||=$event=>_ctx.$emit(`wizard-finish`,$event),onValidationError:_cache[4]||=$event=>_ctx.$emit(`validation-error`,$event)}),createSlots({_:2},[renderList(unref(slots),(slot,name)=>({name,fn:withCtx(props$1=>[renderSlot(_ctx.$slots,name,normalizeProps(guardReactiveProps(props$1)),void 0,!0)])}))]),1040,[`modelValue`])]),_:3})),[[unref(BngBlur_default)]])}},WizardView_default=__plugin_vue_export_helper_default(_sfc_main$299,[[`__scopeId`,`data-v-e47281c4`]]),_hoisted_1$267={key:0,class:`wizard-summary`},_sfc_main$298={__name:`WizardSummary`,props:{custom:{type:Array,default:()=>[],validator:items$2=>items$2.every(item=>item.label&&item.value!==void 0)},replace:{type:Boolean,default:!1}},setup(__props){let props=__props,steps=inject(`wizardSteps`,ref([])),summaryItems=computed(()=>{let customItems=props.custom.map(item=>({stepId:uniqueId(),title:item.label,selectedLabel:item.value,hasSelection:!item.disabled}));if(props.replace)return customItems;let stepsList=steps.value||[],automaticItems=[];return Array.isArray(stepsList)&&(automaticItems=stepsList.filter(step=>step.type===`choice`&&step.choices&&step.choices.length>0).map(step=>{let selectedChoice=step.modelValue?.choice,choiceOption=step.choices.find(choice=>choice.value===selectedChoice);return{stepId:step.id,title:step.title,selectedLabel:choiceOption?.label||null,hasSelection:!!selectedChoice}}).filter(item=>item.hasSelection)),[...automaticItems,...customItems]});return(_ctx,_cache)=>summaryItems.value.length>0?(openBlock(),createElementBlock(`div`,_hoisted_1$267,[(openBlock(!0),createElementBlock(Fragment,null,renderList(summaryItems.value,item=>(openBlock(),createElementBlock(`div`,{key:item.stepId,class:`summary-item`},[createBaseVNode(`strong`,null,toDisplayString(_ctx.$tt(item.title))+`:`,1),createBaseVNode(`span`,{class:normalizeClass({enabled:item.hasSelection,disabled:!item.hasSelection})},toDisplayString(_ctx.$tt(item.selectedLabel||`ui.common.unknown`)),3)]))),128))])):createCommentVNode(``,!0)}},WizardSummary_default=__plugin_vue_export_helper_default(_sfc_main$298,[[`__scopeId`,`data-v-69c45791`]]),_hoisted_1$266={key:0,class:`wizard-step-container`},_hoisted_2$220={key:0,class:`step-description`},_hoisted_3$194=[`innerHTML`],_hoisted_4$166={class:`step-content`},_hoisted_5$143={key:0,class:`wizard-choice-step`},_hoisted_6$123={key:1,class:`wizard-form-step`},_hoisted_7$110={key:2,class:`wizard-confirmation-step`},_hoisted_8$93={key:3,class:`wizard-custom-step`},_hoisted_9$83={class:`custom-placeholder`},_sfc_main$297={__name:`WizardStep`,props:mergeModels({id:{type:String,required:!0},title:String,description:String,type:{type:String,default:`custom`,validator:value=>[`choice`,`form`,`confirmation`,`custom`].includes(value)},autoSkip:{type:Boolean,default:!0},advanceDisabled:{type:Boolean,default:!1},advanceDelay:{type:Number,default:300},required:{type:Boolean,default:!0},validator:{type:Function,default:null},enabledWhen:{type:Array,default:()=>[]},choices:{type:Array,default:()=>[]},component:{type:[String,Object],default:null},componentProps:{type:Object,default:()=>({})}},{modelValue:{default:()=>({})},modelModifiers:{}}),emits:[`update:modelValue`],setup(__props,{expose:__expose}){let props=__props,modelValue=useModel(__props,`modelValue`),registerStep=inject(`registerWizardStep`,null),unregisterStep=inject(`unregisterWizardStep`,null),currentStep=inject(`currentWizardStep`,null),slots=useSlots(),stepContext={stepId:props.id,stepType:props.type};provide(`wizardStepContext`,stepContext),__expose({stepId:props.id,stepContext});let isCurrentStep=computed(()=>currentStep?.value?.id===props.id);return onMounted(()=>{registerStep?.({id:props.id,title:props.title,description:props.description,type:props.type,autoSkip:props.autoSkip,get advanceDisabled(){return props.advanceDisabled},advanceDelay:props.advanceDelay,required:props.required,enabledWhen:props.enabledWhen,validate:props.validator,component:props.component,componentProps:props.componentProps,choices:props.choices,get modelValue(){return modelValue.value},updateModelValue:value=>{modelValue.value=value},hasDefaultSlot:!!slots.default,hasDescriptionSlot:!!slots.description})}),onUnmounted(()=>{unregisterStep?.(props.id)}),(_ctx,_cache)=>isCurrentStep.value?(openBlock(),createElementBlock(`div`,_hoisted_1$266,[__props.description||_ctx.$slots.description?(openBlock(),createElementBlock(`div`,_hoisted_2$220,[renderSlot(_ctx.$slots,`description`,{},()=>[__props.description?(openBlock(),createElementBlock(`div`,{key:0,innerHTML:__props.description},null,8,_hoisted_3$194)):createCommentVNode(``,!0)],!0)])):createCommentVNode(``,!0),createBaseVNode(`div`,_hoisted_4$166,[__props.type===`choice`?(openBlock(),createElementBlock(`div`,_hoisted_5$143,[renderSlot(_ctx.$slots,`default`,{},void 0,!0)])):__props.type===`form`?(openBlock(),createElementBlock(`div`,_hoisted_6$123,[renderSlot(_ctx.$slots,`default`,{},()=>[_cache[0]||=createBaseVNode(`div`,{class:`form-placeholder`},[createBaseVNode(`p`,null,`Add your form content here using BngInput, BngDropdown, etc.`),createBaseVNode(`p`,{class:`form-note`},`Use v-model bindings to connect to step data.`)],-1)],!0)])):__props.type===`confirmation`?(openBlock(),createElementBlock(`div`,_hoisted_7$110,[renderSlot(_ctx.$slots,`default`,{},()=>[createVNode(WizardSummary_default)],!0)])):(openBlock(),createElementBlock(`div`,_hoisted_8$93,[renderSlot(_ctx.$slots,`default`,{},()=>[createBaseVNode(`div`,_hoisted_9$83,[createBaseVNode(`p`,null,`Custom step content for: `+toDisplayString(__props.title),1),_cache[1]||=createBaseVNode(`p`,{class:`custom-note`},`Add your custom content in the WizardStep default slot`,-1)])],!0)]))])])):createCommentVNode(``,!0)}},WizardStep_default=__plugin_vue_export_helper_default(_sfc_main$297,[[`__scopeId`,`data-v-ede4abc3`]]),_hoisted_1$265={class:`description`},_hoisted_2$219={class:`image-section`},_hoisted_3$193={class:`image-row`},_hoisted_4$165=[`src`],_hoisted_5$142=[`src`],_sfc_main$296={__name:`ButtonLayoutView`,setup(__props){let settings$1=useSettings(),handleFinish=async()=>{await settings$1.apply({showedInputLayoutPopupV37:!0}),window.bngVue.gotoGameState(`menu.mainmenu`)},goToControls=async()=>{await settings$1.apply({showedInputLayoutPopupV37:!0}),window.bngVue.gotoGameState(`menu.options.controls.bindings`)};return onMounted(async()=>{await settings$1.waitForData()}),(_ctx,_cache)=>(openBlock(),createBlock(unref(WizardView_default),{title:`Input Changes`,class:`wizard-view`,"show-progress":!1,"finish-button-text":`ui.common.continue`,onWizardFinish:handleFinish},{default:withCtx(()=>[createVNode(unref(WizardStep_default),{id:`buttonLayout`,title:`Extended Modifier Buttons`,type:`confirmation`},{default:withCtx(()=>[withDirectives((openBlock(),createElementBlock(`div`,_hoisted_1$265,[_cache[1]||=createBaseVNode(`p`,null,` We updated the default button layout for Xbox and Playstation controllers using modifier buttons. Below you see the new default layout. `,-1),_cache[2]||=createBaseVNode(`p`,null,[createBaseVNode(`strong`,{class:`warning-text`},`If you made any changes to the default layout on Xbox or Playstation, we suggest you review your current layout and then either edit it or reset to the default if needed.`)],-1),createVNode(unref(bngButton_default),{accent:unref(ACCENTS).primary,onClick:goToControls},{default:withCtx(()=>[..._cache[0]||=[createTextVNode(` Go to Controls `,-1)]]),_:1},8,[`accent`])])),[[unref(BngUiNavScroll_default)]]),createBaseVNode(`div`,_hoisted_2$219,[_cache[3]||=createBaseVNode(`h4`,null,`New Button Layout`,-1),createBaseVNode(`div`,_hoisted_3$193,[createBaseVNode(`img`,{src:unref(getAssetURL)(`images/buttonLayout1.jpg`),alt:`Button Layout`,class:`button-layout-image`},null,8,_hoisted_4$165),createBaseVNode(`img`,{src:unref(getAssetURL)(`images/buttonLayout2.jpg`),alt:`Button Layout`,class:`button-layout-image`},null,8,_hoisted_5$142)])])]),_:1})]),_:1}))}},ButtonLayoutView_default=__plugin_vue_export_helper_default(_sfc_main$296,[[`__scopeId`,`data-v-ff98d0e0`]]),routes_default$2=[{path:`/buttonLayout`,name:`buttonLayout`,component:ButtonLayoutView_default,meta:{infoBar:{visible:!0,showSysInfo:!0},uiApps:{shown:!1}}}],_hoisted_1$264={class:`left`},_hoisted_2$218={class:`branch-icon-assembly`},_hoisted_3$192=[`innerHTML`],_hoisted_4$164=[`innerHTML`],_sfc_main$295={__name:`BranchSkillProgressBar`,props:{skill:Object,mode:{type:String,default:`long`,validator:value=>[`long`,`short`,`simple`,`with-value-label`].includes(value)},showLevel:{type:Boolean,default:!1},showLockedIcon:{type:Boolean,default:!1},isMainProgress:{type:Boolean,default:!1}},setup(__props){let props=__props,headerLeft=computed(()=>props.skill.name),headerRightLevelOrStars=computed(()=>props.skill.isInDevelopment?``:props.skill.unlocked?(props.showLevel&&props.skill.unlocked,props.skill.showProgressAsStars?$translate.contextTranslate({txt:`ui.career.slashStars`,context:{cur:props.skill.value,max:props.skill.max}}):props.skill.levelLabel?props.skill.levelLabel:props.skill.level?$translate.contextTranslate({txt:`ui.career.lvlLabel`,context:{lvl:props.skill.level}}):`Level ${props.skill.level}`):$translate.contextTranslate(`ui.career.locked`)),value=computed(()=>props.skill.max===-1?1:props.skill.value-props.skill.min),max$1=computed(()=>props.skill.max===-1?1:props.skill.max-props.skill.min),valueLabelFormat=computed(()=>{if(props.skill.isInDevelopment)return $translate.contextTranslate(`ui.career.inDevelopment`);if(!props.skill.unlocked)return $translate.contextTranslate(`ui.career.locked`);if(props.mode===`simple`)return props.skill.showProgressAsStars?$translate.contextTranslate({txt:`ui.career.slashStars`,context:{cur:value.value,max:max$1.value}}):$translate.contextTranslate({txt:`ui.career.lvlLabel`,context:{lvl:props.skill.level}});let unit=props.skill.showProgressAsStars?`Stars`:`XP`;return props.skill.max===-1?$translate.contextTranslate({txt:`ui.career.just`+unit,context:{cur:value.value}}):$translate.contextTranslate({txt:`ui.career.slashXP`,context:{cur:value.value,max:max$1.value}})}),skillIcon=computed(()=>props.skill.isInDevelopment?icons.roadblockL:props.skill.unlocked?props.skill.icon||`info`:`lockClosed`),belowValueLabelFormat=computed(()=>{if(!props.skill.unlocked&&props.skill.lockedReason)return $translate.contextTranslate(props.skill.lockedReason?.label||`ui.career.locked`);if(props.skill.isInDevelopment)return $translate.contextTranslate(`ui.career.inDevelopment`);if(props.skill.isMaxLevel)return``;if(!props.skill.showProgressAsStars)return $translate.contextTranslate({txt:`ui.career.justXP`,context:{cur:props.skill.value}})}),branchBackgroundStyle=computed(()=>{let color=props.skill.accentColor;return color?color.startsWith(`--`)?{"background-color":`var(${color})`}:color.startsWith(`#`)?{"background-color":color}:{"background-color":`rgb(${color})`}:{"background-color":`#555555`}});return(_ctx,_cache)=>__props.mode===`simple`?(openBlock(),createElementBlock(`div`,{key:0,class:normalizeClass([`simple-progress`,{"is-locked":!props.skill.unlocked}])},[createBaseVNode(`div`,_hoisted_1$264,[createBaseVNode(`div`,_hoisted_2$218,[!__props.skill.isSkill&&!__props.skill.isBranch?(openBlock(),createElementBlock(`div`,{key:0,class:`branch-background`,style:normalizeStyle(branchBackgroundStyle.value)},null,4)):createCommentVNode(``,!0),createVNode(unref(bngIcon_default),{type:skillIcon.value,class:`assembly-icon`},null,8,[`type`])]),createTextVNode(` `+toDisplayString(_ctx.$ctx_t(headerLeft.value)),1)]),createBaseVNode(`div`,{class:`right`,innerHTML:valueLabelFormat.value},null,8,_hoisted_3$192)],2)):(openBlock(),createElementBlock(`div`,{key:1,class:normalizeClass([`flex-column`,{"is-locked":!props.skill.unlocked}])},[createVNode(unref(bngProgressBar_default),{class:normalizeClass([`stat-progress-bar`,{short:__props.mode===`short`,isMainProgress:__props.isMainProgress}]),headerLeft:_ctx.$ctx_t(headerLeft.value),headerRight:_ctx.$ctx_t(headerRightLevelOrStars.value),value:value.value,max:max$1.value+.001,showValueLabel:!0,valueLabelFormat:``,valueColor:`#eeeeee`},null,8,[`class`,`headerLeft`,`headerRight`,`value`,`max`]),!props.skill.unlocked&&__props.mode===`with-value-label`&&props.showLockedIcon?(openBlock(),createElementBlock(Fragment,{key:0},[],64)):createCommentVNode(``,!0),__props.mode===`with-value-label`?(openBlock(),createElementBlock(`div`,{key:1,class:`below-progress-bar`,innerHTML:belowValueLabelFormat.value},null,8,_hoisted_4$164)):createCommentVNode(``,!0)],2))}},BranchSkillProgressBar_default=__plugin_vue_export_helper_default(_sfc_main$295,[[`__scopeId`,`data-v-2f641a65`]]);function hexToRgb(hex){hex=hex.replace(/^#/,``);let bigint=parseInt(hex,16);return`${bigint>>16&255}, ${bigint>>8&255}, ${bigint&255}`}function getBranchColorStyle({color,accentColor}){let style={};color&&(color.startsWith(`#`)?style[`--branch-color`]=hexToRgb(color):color.startsWith(`var(--`)&&(style[`--branch-color`]=color));let accent=accentColor||color;return accent&&(accent.startsWith(`#`)?style[`--branch-accent-color`]=hexToRgb(accent):accent.startsWith(`var(--`)&&(style[`--branch-accent-color`]=accent)),style}function getIconBackgroundStyle(color){return color?color.startsWith(`--`)?{"background-color":`var(${color})`}:color.startsWith(`#`)?{"background-color":color}:{"background-color":`rgb(${color})`}:{"background-color":`#555555`}}var _hoisted_1$263={class:`branch-details`},_hoisted_2$217={class:`backdrop`},_hoisted_3$191={class:`skill-levels-wrapper`},_hoisted_4$163={key:0,class:`branch-name-container`},_hoisted_5$141={key:2,class:`branch-footer`},_hoisted_6$122={key:0,class:`branch-description`},_hoisted_7$109={key:0,class:`branch-description`},_hoisted_8$92={class:`branch-footer-content`},_hoisted_9$82={class:`certification-text`},_hoisted_10$72={class:`status`},_hoisted_11$65={class:`unlock-info-row`},_hoisted_12$53={class:`icon-box`},_hoisted_13$46={class:`certification-text`},_sfc_main$294={__name:`BranchSkillCard`,props:{branchKey:String,displayMode:{type:String,default:`card`}},emits:[`openBranchPage`],setup(__props,{emit:__emit}){let props=__props,emit$1=__emit,branchData=ref();computed(()=>branchData.value&&`url(${getAssetURL(branchData.value.icon)})`);let branchColor=computed(()=>{let color=branchData.value&&branchData.value.color;return color?color.startsWith(`#`)?hexToRgb(color):color.startsWith(`var(--`)?`${color}`:`transparent`:``}),branchAccentColor=computed(()=>{let color=branchData.value&&(branchData.value.accentColor||branchData.value.color);return color?color.startsWith(`#`)?hexToRgb(color):color.startsWith(`var(--`)?`${color}`:`transparent`:``}),branchIconType=computed(()=>branchData.value&&branchData.value.isInDevelopment?icons.roadblockL:branchData.value&&branchData.value.unlocked?icons[branchData.value.glyphIcon]:icons.lockClosed),isHalf=computed(()=>{if(!branchData.value)return!1;let hasSkills=branchData.value.skills&&branchData.value.skills.length>0,hasDescription=branchData.value.shortDescription;return!hasSkills&&!hasDescription}),safeArray=arr=>Array.isArray(arr)?arr:[],openBranchPage=branchKey=>emit$1(`openBranchPage`,branchKey);function setup$3(data){branchData.value=data,branchData.value.skills=safeArray(data.skills)}let formatColor=color=>color?color.startsWith(`#`)?hexToRgb(color):color.startsWith(`var(--`)?`${color}`:`rgb(255, 255, 255)`:``;return onMounted(async()=>{setup$3(await Lua_default.career_modules_branches_landing.getBranchSkillCardData(props.branchKey))}),(_ctx,_cache)=>branchData.value?(openBlock(),createBlock(unref(bngCard_default),{key:0,class:normalizeClass([`branch-skill-card`,{"row-mode":__props.displayMode===`row`,locked:!branchData.value.unlocked,half:isHalf.value}]),onClick:_cache[0]||=$event=>openBranchPage(__props.branchKey),style:normalizeStyle({"--branch-color":branchColor.value,"--branch-accent-color":branchAccentColor.value})},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_1$263,[_cache[2]||=createBaseVNode(`div`,{class:`indicator left`},null,-1),_cache[3]||=createBaseVNode(`div`,{class:`indicator right`},null,-1),branchData.value.isDomain?createCommentVNode(``,!0):(openBlock(),createElementBlock(`div`,{key:0,class:normalizeClass([`branch-progress`,{"in-development":branchData.value.isInDevelopment}])},[branchData.value.isDomain?createCommentVNode(``,!0):(openBlock(),createElementBlock(`div`,{key:0,class:normalizeClass([`badge`,{"row-badge":__props.displayMode===`row`}])},[createBaseVNode(`div`,_hoisted_2$217,toDisplayString(branchData.value.value.color),1),createVNode(unref(bngIcon_default),{class:`icon-branch`,type:branchIconType.value},null,8,[`type`])],2))],2)),branchData.value.isDomain?(openBlock(),createBlock(unref(aspectRatio_default),{key:1,"external-image":branchData.value.cover,ratio:`16:9`,class:`image-container aspect-ratio`},null,8,[`external-image`])):createCommentVNode(``,!0),createBaseVNode(`div`,_hoisted_3$191,[__props.displayMode===`row`?(openBlock(),createElementBlock(`div`,_hoisted_4$163,[branchData.value?(openBlock(),createBlock(BranchSkillProgressBar_default,{key:0,class:`main-stat-progress-bar`,skill:branchData.value,showLevel:!0,mode:(branchData.value.isInDevelopment&&isHalf.value,``)},null,8,[`skill`,`mode`])):createCommentVNode(``,!0)])):createCommentVNode(``,!0)]),isHalf.value?createCommentVNode(``,!0):(openBlock(),createElementBlock(`div`,_hoisted_5$141,[branchData.value.isInDevelopment?(openBlock(),createElementBlock(`div`,_hoisted_6$122,toDisplayString(_ctx.$ctx_t(`ui.career.inDevelopment`)),1)):(openBlock(),createElementBlock(Fragment,{key:1},[branchData.value.shortDescription?(openBlock(),createElementBlock(`div`,_hoisted_7$109,toDisplayString(_ctx.$ctx_t(branchData.value.shortDescription)),1)):createCommentVNode(``,!0),createBaseVNode(`div`,_hoisted_8$92,[branchData.value.skills?(openBlock(!0),createElementBlock(Fragment,{key:0},renderList(branchData.value.skills,skill=>(openBlock(),createElementBlock(`div`,null,[branchData.value?(openBlock(),createBlock(BranchSkillProgressBar_default,{key:0,skill,mode:`simple`},null,8,[`skill`])):createCommentVNode(``,!0)]))),256)):createCommentVNode(``,!0),(openBlock(!0),createElementBlock(Fragment,null,renderList(branchData.value.certifications,certification=>(openBlock(),createElementBlock(`div`,{class:normalizeClass([`certification-container`,certification.status])},[createVNode(unref(bngIcon_default),{type:unref(icons).badgeRoundStar,style:normalizeStyle({color:certification.status===`completed`?`white`:certification.status===`available`?`rgba(255, 255, 255, 0.6)`:`rgba(255, 255, 255, 0.5)`})},null,8,[`type`,`style`]),createBaseVNode(`div`,_hoisted_9$82,[createTextVNode(toDisplayString(_ctx.$ctx_t(`ui.career.certification.name`))+` `,1),createBaseVNode(`span`,_hoisted_10$72,toDisplayString(_ctx.$ctx_t(certification.statusLabel)),1)])],2))),256)),branchData.value.unlockInfos?(openBlock(),createElementBlock(Fragment,{key:1},[_cache[1]||=createBaseVNode(`div`,{class:`unlock-info-title`},`Required Certifications:`,-1),createBaseVNode(`div`,_hoisted_11$65,[(openBlock(!0),createElementBlock(Fragment,null,renderList(branchData.value.unlockInfos,unlockInfo=>(openBlock(),createElementBlock(`div`,{class:normalizeClass([`unlock-info-item`,unlockInfo.status]),style:normalizeStyle({"--unlock-color":formatColor(unlockInfo.color?unlockInfo.color:`var(--bng-cool-gray-500-rgb)`)})},[createBaseVNode(`div`,_hoisted_12$53,[createVNode(unref(bngIcon_default),{type:unref(icons).badgeRoundStar,class:`certification-icon`},null,8,[`type`])]),createBaseVNode(`div`,_hoisted_13$46,toDisplayString(_ctx.$ctx_t(unlockInfo.label)),1)],6))),256))])],64)):createCommentVNode(``,!0)])],64))]))])]),_:1},8,[`class`,`style`])):createCommentVNode(``,!0)}},BranchSkillCard_default=__plugin_vue_export_helper_default(_sfc_main$294,[[`__scopeId`,`data-v-4321db2f`]]),_hoisted_1$262={class:`condensed`},_hoisted_2$216={key:3,class:`dev-icon-container`},_hoisted_3$190={class:`main-info`},_hoisted_4$162={key:1,class:`stars`},_sfc_main$293={__name:`MissionCard`,props:{mission:Object,isSkeleton:Boolean,showStartableIcons:Boolean},emits:[`clicked`],setup(__props,{emit:__emit}){let props=__props,emit$1=__emit,clicked=()=>emit$1(`clicked`,props.mission),backgroundImageStyle=computed(()=>({backgroundImage:`url(${props.mission.thumbnail})`,maskImage:`linear-gradient(to left, rgba(0, 0, 0, ${props.mission.startable?.75:.2}) 50%, rgba(0, 0, 0, 0.1) 100%)`,filter:props.mission.startable?`none`:`grayscale(100%)`})),iconType$1=computed(()=>props.isSkeleton?icons.medal:icons[props.mission.icon]||icons.medal),iconColor=computed(()=>props.isSkeleton||!props.mission.startable?`var(--bng-cool-gray-600)`:`#fff`),showStartableIcons=computed(()=>!props.isSkeleton&&props.showStartableIcons);return(_ctx,_cache)=>(openBlock(),createBlock(unref(bngCard_default),{"bng-nav-item":``,onClick:clicked,class:normalizeClass({"card-wrapper":!0,"click-startable":__props.mission&&__props.mission.startable})},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_1$262,[__props.isSkeleton?createCommentVNode(``,!0):(openBlock(),createBlock(unref(aspectRatio_default),{key:0,class:`image`,style:normalizeStyle(backgroundImageStyle.value)},null,8,[`style`])),!__props.isSkeleton&&!__props.mission.startable?(openBlock(),createBlock(unref(bngIcon_default),{key:1,class:`locked-icon`,type:unref(icons).lockClosed,color:iconColor.value},null,8,[`type`,`color`])):createCommentVNode(``,!0),!__props.isSkeleton&&showStartableIcons.value?(openBlock(),createElementBlock(Fragment,{key:2},[__props.mission.canStartFromProgressScreen&&__props.mission.startable?(openBlock(),createBlock(unref(bngIcon_default),{key:0,class:`locked-icon`,type:unref(icons).play,color:iconColor.value},null,8,[`type`,`color`])):createCommentVNode(``,!0),!__props.mission.canStartFromProgressScreen&&__props.mission.startable?(openBlock(),createBlock(unref(bngIcon_default),{key:1,class:`locked-icon`,type:unref(icons).mapPoint,color:iconColor.value},null,8,[`type`,`color`])):createCommentVNode(``,!0)],64)):createCommentVNode(``,!0),!__props.isSkeleton&&__props.mission.devMission?(openBlock(),createElementBlock(`div`,_hoisted_2$216,[createVNode(unref(bngIcon_default),{class:`dev-icon`,type:unref(icons).bug,color:`white`},null,8,[`type`]),_cache[0]||=createBaseVNode(`div`,{class:`dev-text`},` DEV MISSION `,-1)])):createCommentVNode(``,!0),_cache[1]||=createBaseVNode(`div`,{class:`highlight-marker`},null,-1),createVNode(unref(bngIcon_default),{class:`mission-icon`,type:iconType$1.value,color:iconColor.value},null,8,[`type`,`color`]),createVNode(unref(bngBinding_default),{class:`input-icon`,"ui-event":`ok`,controller:``}),createBaseVNode(`div`,_hoisted_3$190,[__props.isSkeleton?createCommentVNode(``,!0):(openBlock(),createElementBlock(`div`,{key:0,class:normalizeClass([`heading`,{locked:!__props.mission.startable}])},toDisplayString(_ctx.$tt(__props.mission.label)),3)),!__props.isSkeleton&&__props.mission.startable&&__props.mission.formattedProgress?(openBlock(),createElementBlock(`div`,_hoisted_4$162,[__props.mission.formattedProgress.unlockedStars&&__props.mission.formattedProgress.unlockedStars.totalDefaultStarCount?(openBlock(),createBlock(unref(bngMainStars_default),{key:0,individualStars:__props.mission.formattedProgress.unlockedStars.defaults,class:`main-stars`,scale:.6},null,8,[`individualStars`])):createCommentVNode(``,!0),__props.mission.formattedProgress.unlockedStars&&__props.mission.formattedProgress.unlockedStars.totalBonusStarCount>0?(openBlock(),createBlock(unref(bngMainStars_default),{key:1,individualStars:__props.mission.formattedProgress.unlockedStars.bonus,class:`bonus-stars`,scale:.6},null,8,[`individualStars`])):createCommentVNode(``,!0)])):createCommentVNode(``,!0)])])]),_:1},8,[`class`]))}},MissionCard_default=__plugin_vue_export_helper_default(_sfc_main$293,[[`__scopeId`,`data-v-52ea67db`]]),_hoisted_1$261={class:`rewards-pills-container`},_sfc_main$292={__name:`RewardPill`,props:{icon:String,attributeKey:String,rewardAmount:Number,highlight:Boolean,hideNumbers:Boolean,backgroundColor:{type:String,default:`rgba(var(--bng-cool-gray-900-rgb), 0.5)`}},setup(__props){return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$261,[createBaseVNode(`div`,{class:`pill`,style:normalizeStyle({backgroundColor:__props.backgroundColor,filter:__props.highlight?`brightness(350%)`:``})},[createVNode(unref(bngUnit_default),mergeProps({[__props.icon?`beamXP`:__props.attributeKey]:__props.rewardAmount},{options:__props.hideNumbers?{formatter:x=>null}:null,iconType:__props.icon?unref(icons)[__props.icon]:null,formatter:__props.attributeKey}),null,16,[`options`,`iconType`,`formatter`])],4)]))}},RewardPill_default=__plugin_vue_export_helper_default(_sfc_main$292,[[`__scopeId`,`data-v-7719e2fc`]]),_hoisted_1$260={class:`rewards-pills-container`},_sfc_main$291={__name:`RewardsPills`,props:{rewards:Object,hideNumbers:Boolean,negativeBackground:{type:Boolean,default:!0}},setup(__props){return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$260,[(openBlock(!0),createElementBlock(Fragment,null,renderList(__props.rewards,reward=>(openBlock(),createBlock(RewardPill_default,{icon:reward.icon,hideNumbers:__props.hideNumbers,attributeKey:reward.attributeKey,rewardAmount:reward.rewardAmount,highlight:reward.highlight,backgroundColor:__props.negativeBackground&&reward.rewardAmount<0?`rgba(var(--bng-add-red-700-rgb), 0.5)`:void 0},null,8,[`icon`,`hideNumbers`,`attributeKey`,`rewardAmount`,`highlight`,`backgroundColor`]))),256))]))}},RewardsPills_default=__plugin_vue_export_helper_default(_sfc_main$291,[[`__scopeId`,`data-v-40e5103d`]]),_hoisted_1$259={key:0,class:`animated-border claimable`},_hoisted_2$215={key:1,class:`complete`},_hoisted_3$189={key:0,class:`complete`},_hoisted_4$161={key:1,class:`complete-badge`},_hoisted_5$140={key:2,class:`step`},_hoisted_6$121={key:3,class:`step`},_hoisted_7$108={class:`content`},_hoisted_8$91={class:`heading`},_hoisted_9$81={key:0,class:`middle-content`},_hoisted_10$71={key:1,class:`middle-content`},_hoisted_11$64={key:3,class:`progress`},_sfc_main$290={__name:`MilestoneCard`,props:{milestone:Object,isCondensed:Boolean},emits:[`claim`],setup(__props,{emit:__emit}){let props=__props,emit$1=__emit,claimMilestone=()=>{console.log(`claimMilestone`,props.milestone),props.milestone.claimable&&(emit$1(`claim`,props.milestone),console.log(props.milestone))},milestoneColor=computed(()=>{let color=props.milestone.color;return color?color.startsWith(`#`)?hexToRgb$1(color):color.startsWith(`var(--`)?`${color}`:`transparent`:``});function hexToRgb$1(hex){return`${parseInt(hex.slice(1,3),16)}, ${parseInt(hex.slice(3,5),16)}, ${parseInt(hex.slice(5,7),16)}`}return(_ctx,_cache)=>withDirectives((openBlock(),createElementBlock(`div`,{"bng-nav-item":``,onClick:claimMilestone,class:`condensed`},[__props.milestone.claimable?(openBlock(),createElementBlock(`div`,_hoisted_1$259)):createCommentVNode(``,!0),__props.milestone.completed?(openBlock(),createElementBlock(`div`,_hoisted_2$215)):createCommentVNode(``,!0),createVNode(unref(aspectRatio_default),{class:`image`,style:normalizeStyle({backgroundColor:`rgb(`+milestoneColor.value+`)`}),ratio:`21:9`},{default:withCtx(()=>[__props.milestone.completed?(openBlock(),createElementBlock(`div`,_hoisted_3$189)):createCommentVNode(``,!0),__props.milestone.completed?(openBlock(),createElementBlock(`div`,_hoisted_4$161,[createVNode(unref(bngIcon_default),{class:`glyph small`,type:unref(icons).checkmark},null,8,[`type`])])):createCommentVNode(``,!0),createVNode(unref(bngIcon_default),{class:`glyph`,type:unref(icons)[__props.milestone.icon]},null,8,[`type`]),__props.milestone.step!==void 0&&__props.milestone.maxStep!==void 0?(openBlock(),createElementBlock(`div`,_hoisted_5$140,toDisplayString(__props.milestone.step)+`/`+toDisplayString(__props.milestone.maxStep),1)):createCommentVNode(``,!0),__props.milestone.step!==void 0&&__props.milestone.maxStep===void 0?(openBlock(),createElementBlock(`div`,_hoisted_6$121,toDisplayString(__props.milestone.step),1)):createCommentVNode(``,!0)]),_:1},8,[`style`]),createBaseVNode(`div`,_hoisted_7$108,[createBaseVNode(`div`,_hoisted_8$91,toDisplayString(_ctx.$ctx_t(__props.milestone.label)),1),__props.milestone.description?(openBlock(),createElementBlock(`div`,_hoisted_9$81,toDisplayString(_ctx.$ctx_t(__props.milestone.description)),1)):createCommentVNode(``,!0),__props.milestone.rewards?(openBlock(),createElementBlock(`div`,_hoisted_10$71,[createVNode(RewardsPills_default,{rewards:__props.milestone.rewards},null,8,[`rewards`])])):createCommentVNode(``,!0),__props.milestone.completed?(openBlock(),createBlock(unref(bngProgressBar_default),{key:2,value:1,max:1,min:0,valueLabelFormat:`Complete!`,class:`progress`})):createCommentVNode(``,!0),__props.milestone.progress?(openBlock(),createElementBlock(`div`,_hoisted_11$64,[(openBlock(!0),createElementBlock(Fragment,null,renderList(__props.milestone.progress,prog=>(openBlock(),createBlock(unref(bngProgressBar_default),{class:normalizeClass({claimProgressBar:__props.milestone.claimable}),value:prog.currValue,max:prog.maxValue,min:prog.minValue,valueLabelFormat:__props.milestone.claimable?`Click to claim!`:_ctx.$ctx_t(prog.label)},null,8,[`class`,`value`,`max`,`min`,`valueLabelFormat`]))),256))])):createCommentVNode(``,!0)])])),[[unref(BngOnUiNav_default),void 0,`ok`,{focusRequired:!0,asMouse:!0}]])}},MilestoneCard_default=__plugin_vue_export_helper_default(_sfc_main$290,[[`__scopeId`,`data-v-8fc3424a`]]),_hoisted_1$258={class:`progress-track`},_hoisted_2$214={key:0,class:`progress-fill`,style:{height:`100%`}},_hoisted_3$188={class:`header`},_hoisted_4$160={class:`name`},_hoisted_5$139={key:0,class:`stars`},_hoisted_6$120={key:1,class:`stars`},_hoisted_7$107={class:`info`},_hoisted_8$90={class:`unlock-condition`},_hoisted_9$80={class:`info`},_hoisted_10$70={class:`label`},_hoisted_11$63={class:`description`},_hoisted_12$52={key:0,class:`cards-container`},_hoisted_13$45={class:`basic-card locked coming-soon`},_hoisted_14$42={class:`label`},_hoisted_15$40={key:1,class:`right`},_sfc_main$289={__name:`LeagueRow`,props:{league:Object,leagueMissionClicked:Function,condensed:Boolean,vertical:Boolean,nowUnlocked:Boolean},setup(__props){let props=__props;function hexToRgb$1(hex){hex=hex.replace(/^#/,``);let bigint=parseInt(hex,16);return`${bigint>>16&255}, ${bigint>>8&255}, ${bigint&255}`}let leagueStyle=computed(()=>{if(!props.league.accentColor)return{};let style={};return props.league.accentColor.startsWith(`#`)?style[`--league-accent-color`]=hexToRgb$1(props.league.accentColor):props.league.accentColor.startsWith(`var(--`)&&(style[`--league-accent-color`]=props.league.accentColor),style});return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,{class:normalizeClass([`league-row`,{locked:!__props.league._unlocked,condensed:__props.condensed}]),style:normalizeStyle(leagueStyle.value)},[createBaseVNode(`div`,_hoisted_1$258,[__props.league._unlocked?(openBlock(),createElementBlock(`div`,_hoisted_2$214)):createCommentVNode(``,!0)]),createBaseVNode(`div`,_hoisted_3$188,[createBaseVNode(`div`,_hoisted_4$160,[createVNode(unref(bngIcon_default),{type:unref(icons)[__props.league.icon],class:`skill-icon`,color:__props.league._unlocked?`white`:`gray`},null,8,[`type`,`color`]),createTextVNode(` `+toDisplayString(_ctx.$ctx_t(__props.league.name)),1)]),__props.nowUnlocked?(openBlock(),createElementBlock(`div`,_hoisted_6$120,[createVNode(unref(bngIcon_default),{type:unref(icons).lockOpened},null,8,[`type`])])):(openBlock(),createElementBlock(`div`,_hoisted_5$139,[__props.league._unlocked?(openBlock(),createBlock(unref(bngMainStars_default),{key:0,"unlocked-stars":__props.league.totalStarsObtained,"total-stars":__props.league.totalStarsAvailable,class:`main-stars`,scale:.8,reverse:``,numerical:``},null,8,[`unlocked-stars`,`total-stars`])):createCommentVNode(``,!0)]))]),createBaseVNode(`div`,{class:normalizeClass([`content-row`,{vertical:__props.vertical}])},[createBaseVNode(`div`,_hoisted_7$107,[(openBlock(!0),createElementBlock(Fragment,null,renderList(__props.league.unlock,cond=>(openBlock(),createElementBlock(Fragment,null,[cond.hidden?createCommentVNode(``,!0):(openBlock(),createBlock(unref(bngCard_default),{key:0},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_8$90,[createBaseVNode(`div`,_hoisted_9$80,[createVNode(unref(bngIcon_default),{class:`icon`,type:cond.met?unref(icons).lockOpened:unref(icons).lockClosed,color:cond.met?`white`:`gray`},null,8,[`type`,`color`]),createBaseVNode(`div`,_hoisted_10$70,toDisplayString(cond.label),1)]),cond.progress?(openBlock(),createBlock(unref(bngProgressBar_default),{key:0,value:cond.progress.cur,min:cond.progress.min,max:cond.progress.max,valueLabelFormat:``,class:`progress`},null,8,[`value`,`min`,`max`])):createCommentVNode(``,!0)])]),_:2},1024))],64))),256)),createBaseVNode(`div`,_hoisted_11$63,toDisplayString(_ctx.$ctx_t(__props.league.description)),1)]),__props.condensed?(openBlock(),createElementBlock(`div`,_hoisted_15$40,toDisplayString(__props.league.missions.length)+` Challenges `,1)):(openBlock(),createElementBlock(`div`,_hoisted_12$52,[(openBlock(!0),createElementBlock(Fragment,null,renderList(__props.league.missions,mission=>(openBlock(),createBlock(MissionCard_default,{class:`clickable-card`,key:mission.id,mission,onClicked:__props.leagueMissionClicked,showStartableIcons:!0},null,8,[`mission`,`onClicked`]))),128)),(openBlock(!0),createElementBlock(Fragment,null,renderList(__props.league.driftSpots,driftSpot=>(openBlock(),createBlock(MissionCard_default,{class:`clickable-card`,key:driftSpot.id,mission:driftSpot,onClicked:__props.leagueMissionClicked},null,8,[`mission`,`onClicked`]))),128)),__props.league.comingSoon?(openBlock(!0),createElementBlock(Fragment,{key:0},renderList(__props.league.comingSoon,info=>(openBlock(),createBlock(unref(bngCard_default),{class:`card-height`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_13$45,[createVNode(unref(bngIcon_default),{class:`icon`,type:unref(icons)[info.icon],color:`gray`},null,8,[`type`]),createBaseVNode(`div`,_hoisted_14$42,toDisplayString(info.label),1)])]),_:2},1024))),256)):createCommentVNode(``,!0)]))],2)],6))}},LeagueRow_default=__plugin_vue_export_helper_default(_sfc_main$289,[[`__scopeId`,`data-v-f92a650f`]]),_hoisted_1$257={class:`label`},_hoisted_2$213={class:`text`},_hoisted_3$187={class:`description`},_sfc_main$288={__name:`TaskGoal`,props:{label:[String,Object],description:[String,Object],complete:Boolean,success:Boolean,settings:{type:Object,default:{animate:!1,animateOnMount:!1,successCallback:Function}}},setup(__props){let props=__props,slots=useSlots(),animationSettings=inject(`animationSettings`,props.settings),animate=ref(!1),labelParsed=computed(()=>parse$1($translate.contextTranslate(props.label,!0))),descriptionParsed=computed(()=>parse$1($translate.contextTranslate(props.description,!0))),checkboxSvgs=computed(()=>({"--checkbox-empty":`url(${getAssetURL(`icons/general/checkbox-empty.svg`)})`,"--checkbox-ok":`url(${getAssetURL(`icons/general/checkbox-ok.svg`)})`,"--checkbox-nope":`url(${getAssetURL(`icons/general/checkbox-nope.svg`)})`}));return watch(()=>[props.complete,props.success],(newValues,oldValues)=>{let isComplete=newValues[0],isSuccess=newValues[1];animate.value=animationSettings.animate&&isComplete,isSuccess&&animationSettings.successCallback()}),onBeforeMount(()=>{animate.value=props.settings.animate&&props.settings.animateOnMount}),(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,{class:normalizeClass([`task-goal`,{success:__props.complete&&__props.success,fail:__props.complete&&!__props.success,animate:animate.value}])},[createBaseVNode(`div`,_hoisted_1$257,[createBaseVNode(`span`,{class:`checkbox`,style:normalizeStyle(checkboxSvgs.value)},null,4),createBaseVNode(`span`,_hoisted_2$213,[unref(slots).label?renderSlot(_ctx.$slots,`label`,{key:0},void 0,!0):__props.label?(openBlock(),createBlock(unref(dynamicComponent_default),{key:1,template:labelParsed.value},null,8,[`template`])):createCommentVNode(``,!0)])]),createBaseVNode(`span`,_hoisted_3$187,[unref(slots).description?renderSlot(_ctx.$slots,`description`,{key:0},void 0,!0):__props.description?(openBlock(),createBlock(unref(dynamicComponent_default),{key:1,template:descriptionParsed.value},null,8,[`template`])):createCommentVNode(``,!0)])],2))}},TaskGoal_default=__plugin_vue_export_helper_default(_sfc_main$288,[[`__scopeId`,`data-v-5a381682`]]),_hoisted_1$256={key:0,class:`wrapper`},_hoisted_2$212={class:`heading`},_hoisted_3$186={class:`description`},_hoisted_4$159={key:1,class:`tasklist wrapper`},_hoisted_5$138={class:`task-content`},_hoisted_6$119={class:`heading`},_hoisted_7$106={class:`description`},_sfc_main$287={__name:`UnlockCard`,props:{data:Object},setup(__props){return(_ctx,_cache)=>(openBlock(),createElementBlock(Fragment,null,[__props.data.type==`tasklist`?createCommentVNode(``,!0):(openBlock(),createElementBlock(`div`,_hoisted_1$256,[createVNode(unref(bngIcon_default),{class:`icon`,type:unref(icons)[__props.data.icon]},null,8,[`type`]),createBaseVNode(`div`,_hoisted_2$212,toDisplayString(__props.data.heading),1),createBaseVNode(`div`,_hoisted_3$186,toDisplayString(__props.data.description),1)])),__props.data.type==`tasklist`?(openBlock(),createElementBlock(`div`,_hoisted_4$159,[(openBlock(!0),createElementBlock(Fragment,null,renderList(__props.data.tasklistData.tasks,task=>(openBlock(),createElementBlock(`div`,{class:`task`,key:task.label},[createVNode(unref(bngIcon_default),{class:`icon`,type:unref(icons)[task.done?`checkboxOn`:`checkboxOff`]},null,8,[`type`]),createBaseVNode(`div`,_hoisted_5$138,[createBaseVNode(`div`,_hoisted_6$119,toDisplayString(task.label),1),createBaseVNode(`div`,_hoisted_7$106,toDisplayString(task.description),1)])]))),128))])):createCommentVNode(``,!0)],64))}},UnlockCard_default=__plugin_vue_export_helper_default(_sfc_main$287,[[`__scopeId`,`data-v-c5fa6ca1`]]),_hoisted_1$255={class:`unlock-rows`},_hoisted_2$211={class:`rows-container`},_hoisted_3$185={class:`progress-track`},_hoisted_4$158={key:0,class:`progress-fill`,style:{height:`100%`}},_hoisted_5$137={class:`header`},_hoisted_6$118={class:`level-name-and-heading`},_hoisted_7$105={class:`level-label`},_hoisted_8$89={key:0,class:`description-heading`},_hoisted_9$79={class:`content-row`},_hoisted_10$69={class:`description-column`},_hoisted_11$62={class:`unlock-condition`},_hoisted_12$51={class:`info`},_hoisted_13$44={class:`label`},_hoisted_14$41={key:1,class:`description-text`},_hoisted_15$39={class:`unlocks-column`},_hoisted_16$38={key:0,class:`unlocks-list`},_sfc_main$286={__name:`UnlockRows`,props:{value:{type:Number,default:0},min:{type:Number,default:0},max:{type:Number,required:!0},maxRequiredValue:{type:Number,required:!1},tiers:Array,currentTier:Number,unlocked:Boolean,progressFillColor:{type:String,default:`#ff6600`}},setup(__props){useCssVars(_ctx=>({v1b3c87f1:props.progressFillColor.startsWith(`var(--`)&&props.progressFillColor.endsWith(`-rgb)`)?`rgb(${props.progressFillColor})`:props.progressFillColor}));let props=__props;function hexToRgb$1(hex){hex=hex.replace(/^#/,``);let bigint=parseInt(hex,16);return`${bigint>>16&255}, ${bigint>>8&255}, ${bigint&255}`}let progressStyle=computed(()=>{if(!props.progressFillColor)return{};let style={};return props.progressFillColor.startsWith(`#`)?style[`--progress-fill-color`]=hexToRgb$1(props.progressFillColor):props.progressFillColor.startsWith(`var(--`)&&(style[`--progress-fill-color`]=props.progressFillColor),style});return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$255,[createBaseVNode(`div`,_hoisted_2$211,[(openBlock(!0),createElementBlock(Fragment,null,renderList(__props.tiers,(tier,idx)=>(openBlock(),createElementBlock(`div`,{key:tier.index,class:normalizeClass({"tier-row":!0,"grayed-out":__props.currentTier<=tier.index-1,completed:__props.currentTier+1>tier.index,"in-development":tier.isInDevelopment,"first-tier":idx===0,"last-tier":idx===__props.tiers.length-1})},[createBaseVNode(`div`,_hoisted_3$185,[__props.currentTier+1>tier.index?(openBlock(),createElementBlock(`div`,_hoisted_4$158)):createCommentVNode(``,!0)]),createBaseVNode(`div`,_hoisted_5$137,[createBaseVNode(`div`,_hoisted_6$118,[createBaseVNode(`span`,_hoisted_7$105,`Level `+toDisplayString(tier.label?tier.label:tier.index),1),tier.description&&tier.description.heading?(openBlock(),createElementBlock(`span`,_hoisted_8$89,`: `+toDisplayString(tier.description.heading),1)):createCommentVNode(``,!0)])]),createBaseVNode(`div`,_hoisted_9$79,[createBaseVNode(`div`,_hoisted_10$69,[tier.isInDevelopment||__props.currentTier+1<=tier.index||!__props.unlocked?(openBlock(),createBlock(unref(bngCard_default),{key:0,class:`unlock-condition-card`,style:normalizeStyle(progressStyle.value)},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_11$62,[createBaseVNode(`div`,_hoisted_12$51,[createVNode(unref(bngIcon_default),{class:`icon`,type:tier.isInDevelopment?unref(icons).roadblockL:unref(icons).lockClosed,color:`gray`},null,8,[`type`]),createBaseVNode(`div`,_hoisted_13$44,[tier.isInDevelopment?(openBlock(),createElementBlock(Fragment,{key:0},[createTextVNode(` Coming Soon! `)],64)):(openBlock(),createElementBlock(Fragment,{key:1},[createTextVNode(toDisplayString(tier.xpCurrent)+` / `+toDisplayString(tier.xpRequired)+` XP `,1)],64))])]),!tier.isInDevelopment&&tier.currentValue&&tier.requiredValue?(openBlock(),createBlock(unref(bngProgressBar_default),{key:0,value:tier.xpCurrent,min:0,max:tier.xpRequired,valueLabelFormat:``,class:`progress`},null,8,[`value`,`max`])):createCommentVNode(``,!0)])]),_:2},1032,[`style`])):createCommentVNode(``,!0),tier.description&&tier.description.description?(openBlock(),createElementBlock(`div`,_hoisted_14$41,toDisplayString(tier.description.description),1)):createCommentVNode(``,!0)]),createBaseVNode(`div`,_hoisted_15$39,[tier.list&&tier.list.length>0?(openBlock(),createElementBlock(`div`,_hoisted_16$38,[(openBlock(!0),createElementBlock(Fragment,null,renderList(tier.list,(item,idx$1)=>(openBlock(),createBlock(UnlockCard_default,{key:idx$1,class:`unlock-item`,data:item},null,8,[`data`]))),128))])):createCommentVNode(``,!0)])])],2))),128))])]))}},UnlockRows_default=__plugin_vue_export_helper_default(_sfc_main$286,[[`__scopeId`,`data-v-ec31f890`]]),_hoisted_1$254={class:`flex-row`},_hoisted_2$210={class:`player-content`},_hoisted_3$184={class:`stats-row`},_hoisted_4$157={class:`stat-content`},_sfc_main$285={__name:`careerSimpleStats`,setup(__props,{expose:__expose}){let careerStatsData=ref({}),handleCareerSimpleStats=data=>{data.branches.forEach(entry=>{entry.hasOwnProperty(`levelLabel`)&&(entry.name=$translate.contextTranslate(entry.name,!0),entry.levelLabel=$translate.contextTranslate(entry.levelLabel,!0))}),careerStatsData.value=data},updateDisplay=()=>{Lua_default.career_modules_uiUtils.getCareerSimpleStats().then(handleCareerSimpleStats)};return onMounted(()=>{updateDisplay()}),__expose({updateDisplay}),(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$254,[createBaseVNode(`div`,_hoisted_2$210,toDisplayString(careerStatsData.value.saveSlotName),1),createBaseVNode(`div`,_hoisted_3$184,[(openBlock(!0),createElementBlock(Fragment,null,renderList(careerStatsData.value.branches,branch=>(openBlock(),createElementBlock(`div`,_hoisted_4$157,[createVNode(unref(bngProgressBar_default),{class:`stat-progress-bar`,headerLeft:branch.name,headerRight:branch.levelLabel,min:branch.min,value:branch.value,max:branch.max},null,8,[`headerLeft`,`headerRight`,`min`,`value`,`max`])]))),256))])]))}},careerSimpleStats_default=__plugin_vue_export_helper_default(_sfc_main$285,[[`__scopeId`,`data-v-94a9390d`]]),_sfc_main$284={__name:`careerStatus`,props:{slim:{type:Boolean,default:!1}},setup(__props,{expose:__expose}){let careerStatusData=ref({}),handleCareerStatusData=data=>careerStatusData.value=data,updateDisplay=()=>Lua_default.career_modules_uiUtils.getCareerStatusData().then(handleCareerStatusData);return onMounted(updateDisplay),__expose({updateDisplay}),(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,null,[createBaseVNode(`div`,{class:normalizeClass([`career-status-progress`,{slim:__props.slim}])},[createVNode(unref(bngUnit_default),{class:`career-status-value`,insuranceScore:careerStatusData.value.insuranceScore},null,8,[`insuranceScore`]),createVNode(unref(bngDivider_default)),createVNode(unref(bngUnit_default),{class:`career-status-value`,vouchers:careerStatusData.value.vouchers},null,8,[`vouchers`]),createVNode(unref(bngDivider_default)),createVNode(unref(bngUnit_default),{class:`career-status-value`,money:careerStatusData.value.money},null,8,[`money`])],2)]))}},careerStatus_default=__plugin_vue_export_helper_default(_sfc_main$284,[[`__scopeId`,`data-v-0446c53b`]]),_hoisted_1$253={key:0},_sfc_main$283={__name:`TutorialButton`,props:{text:{type:String,default:``},icon:{type:Object,default:()=>icons.questionmark},pages:{type:Object,default:[]}},setup(__props){let props=__props,buttonRef=ref(null),seen$3=ref(!0);function clickHandler(){for(let key of props.pages)Lua_default.career_modules_linearTutorial.introPopup(key,!0);seen$3.value=!0}return onMounted(()=>{}),onUnmounted(()=>{}),(_ctx,_cache)=>withDirectives((openBlock(),createBlock(unref(bngButton_default),{ref_key:`buttonRef`,ref:buttonRef,class:normalizeClass([`tut-btn`,{blink:!seen$3.value}]),icon:__props.icon,onClick:withModifiers(clickHandler,[`stop`])},{default:withCtx(()=>[__props.text?(openBlock(),createElementBlock(`span`,_hoisted_1$253,toDisplayString(__props.text),1)):createCommentVNode(``,!0)]),_:1},8,[`icon`,`class`])),[[unref(BngTooltip_default),__props.text?void 0:`View tutorial for this section`]])}},TutorialButton_default=__plugin_vue_export_helper_default(_sfc_main$283,[[`__scopeId`,`data-v-3e539b42`]]),_hoisted_1$252={class:`content`},_hoisted_2$209={class:`insurance-perks-div`},_hoisted_3$183={key:0,class:`leaving-insurance-wrapper`},_hoisted_4$156={class:`breakdown-items-wrapper`},_hoisted_5$136={class:`breakdown-item`},_hoisted_6$117={class:`orange-price`},_hoisted_7$104={class:`breakdown-item`},_hoisted_8$88={class:`red-price`},_hoisted_9$78={class:`breakdown-item total`},_hoisted_10$68={class:`breakdown-item-value-total green-price`},_hoisted_11$61={key:1,class:`no-insurance-wrapper`},_hoisted_12$50={key:2,class:`group-discount-wrapper`},_hoisted_13$43={class:`group-discount-icon-wrapper`},_hoisted_14$40={class:`group-discount-main-text`},_hoisted_15$38={class:`tier-text`},_hoisted_16$37={class:`tier-text`},_hoisted_17$31={class:`discount-text`},_hoisted_18$28={class:`grey-small-text`},_hoisted_19$24={key:3,class:`price-details-wrapper`},_hoisted_20$20={class:`price-tile`},_hoisted_21$18={key:0,class:`old-price-wrapper`},_hoisted_22$16={class:`old-price`},_hoisted_23$15={class:`price-tile-value-wrapper`},_hoisted_24$14={key:1,class:`deductible-discount`},_hoisted_25$13={class:`price-tile`},_hoisted_26$11={class:`price-tile-title`},_hoisted_27$11={class:`price-tile-value-wrapper`},_hoisted_28$10={class:`premium-extra-info`},_hoisted_29$10={class:`renewal-distance`},_sfc_main$282={__name:`insuranceCard`,props:{insuranceData:Object,isSelected:Boolean,isCurrentProvider:{type:Boolean,default:!1}},emits:[`select`],setup(__props,{emit:__emit}){let props=__props,{units}=useBridge(),emit$1=__emit,hasNoInsurance=computed(()=>props.insuranceData?.id===-1),pillText=computed(()=>{if(props.isCurrentProvider)return`CURRENT PROVIDER`;if(props.insuranceData.groupDiscountData){if(props.insuranceData.groupDiscountData?.willHaveGroupDiscountForTheFirstTime)return`MULTI-VEHICLE DISCOUNT AVAILABLE`;if(props.insuranceData.groupDiscountData?.willBumpTheirDiscount)return`BIGGER DISCOUNT AVAILABLE`;if(props.insuranceData.groupDiscountData?.currentTierData&&props.insuranceData.groupDiscountData?.currentTierData.id>0)return`MULTI-VEHICLE DISCOUNT ACTIVE`}return null}),renewsInFormatted=computed(()=>props.insuranceData?.renewsIn?units.buildString(`length`,props.insuranceData.renewsIn*1e3,0):``),leavingInsuranceRenewsInFormatted=computed(()=>props.insuranceData?.leavingInsuranceInfo?.renewsIn?units.buildString(`length`,props.insuranceData.leavingInsuranceInfo.renewsIn*1e3,0):``),selectCard=()=>{emit$1(`select`,props.insuranceData.id)},cardStyles=computed(()=>{let styles={};return!hasNoInsurance.value&&props.insuranceData.color&&(styles[`--insurance-card-rgb`]=hexToRgb(props.insuranceData.color)),styles});return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,{class:normalizeClass([`insurance-card-container`,{selected:__props.isSelected,"no-insurance-card":hasNoInsurance.value,"current-provider":__props.isCurrentProvider}]),style:normalizeStyle(cardStyles.value),onClick:selectCard,"bng-nav-item":``},[pillText.value===null?createCommentVNode(``,!0):(openBlock(),createElementBlock(`div`,{key:0,class:normalizeClass([`top-pill`,{"no-insurance":hasNoInsurance.value,"orange-pill":__props.insuranceData.groupDiscountData?.willHaveGroupDiscountForTheFirstTime,"current-provider-pill":__props.isCurrentProvider}])},[createBaseVNode(`div`,null,toDisplayString(pillText.value),1)],2)),createBaseVNode(`div`,_hoisted_1$252,[createVNode(unref(insuranceIdentity_default),{class:`insurance-identity`,insuranceData:__props.insuranceData},null,8,[`insuranceData`]),_cache[13]||=createBaseVNode(`div`,{class:`separator`},null,-1),createBaseVNode(`div`,_hoisted_2$209,[hasNoInsurance.value?(openBlock(),createElementBlock(`div`,{key:0,class:normalizeClass([`perks-header`,{"no-insurance":hasNoInsurance.value}])},toDisplayString(hasNoInsurance.value?`Consequences`:`Included Benefits`),3)):createCommentVNode(``,!0),createVNode(unref(insurancePerks_default),{insuranceData:__props.insuranceData},null,8,[`insuranceData`])]),_cache[14]||=createBaseVNode(`div`,{class:`separator`},null,-1),hasNoInsurance.value&&__props.insuranceData.leavingInsuranceInfo&&!__props.isCurrentProvider?(openBlock(),createElementBlock(`div`,_hoisted_3$183,[_cache[4]||=createBaseVNode(`div`,{class:`leaving-insurance-title`},`Cancellation Refund`,-1),createBaseVNode(`div`,_hoisted_4$156,[createBaseVNode(`div`,_hoisted_5$136,[createBaseVNode(`span`,null,` Unused coverage (`+toDisplayString(leavingInsuranceRenewsInFormatted.value)+`) `,1),createBaseVNode(`span`,_hoisted_6$117,[_cache[0]||=createTextVNode(` + `,-1),createVNode(unref(bngUnit_default),{money:__props.insuranceData.leavingInsuranceInfo.coverageRefundPrice},null,8,[`money`])])]),createBaseVNode(`div`,_hoisted_7$104,[_cache[2]||=createBaseVNode(`span`,null,` Early Cancellation Fee (25%) `,-1),createBaseVNode(`span`,_hoisted_8$88,[_cache[1]||=createTextVNode(` - `,-1),createVNode(unref(bngUnit_default),{money:__props.insuranceData.leavingInsuranceInfo.earlyTerminationPenalty},null,8,[`money`])])]),createBaseVNode(`div`,_hoisted_9$78,[_cache[3]||=createBaseVNode(`span`,{class:`breakdown-item-label-total`},` You'll receive `,-1),createBaseVNode(`span`,_hoisted_10$68,[createVNode(unref(bngUnit_default),{money:__props.insuranceData.leavingInsuranceInfo.netRefundPrice},null,8,[`money`])])])])])):createCommentVNode(``,!0),hasNoInsurance.value?(openBlock(),createElementBlock(`div`,_hoisted_11$61,[..._cache[5]||=[createBaseVNode(`span`,{class:`no-insurance-warning`},` You will pay full repair costs `,-1),createBaseVNode(`span`,null,` No coverage or benefits included `,-1)]])):createCommentVNode(``,!0),!hasNoInsurance.value&&__props.insuranceData.groupDiscountData?.mainText?(openBlock(),createElementBlock(`div`,_hoisted_12$50,[createBaseVNode(`div`,null,[createBaseVNode(`span`,_hoisted_13$43,[createVNode(unref(bngIcon_default),{type:unref(icons).checkmark},null,8,[`type`])]),createBaseVNode(`span`,_hoisted_14$40,toDisplayString(__props.insuranceData.groupDiscountData?.mainText),1)]),createBaseVNode(`div`,null,[_cache[7]||=createBaseVNode(`span`,{class:`grey-small-text`},` Currently Insured : `,-1),createBaseVNode(`span`,null,[createVNode(unref(bngIcon_default),{class:`vehicles-icon`,type:unref(icons).car},null,8,[`type`])]),createBaseVNode(`span`,_hoisted_15$38,toDisplayString(__props.insuranceData.carsInsuredCount),1),__props.insuranceData.groupDiscountData?.currentTierData?.id>0?(openBlock(),createElementBlock(Fragment,{key:0},[_cache[6]||=createBaseVNode(`span`,{class:`vertical-separator`},` | `,-1),createBaseVNode(`span`,_hoisted_16$37,` Tier `+toDisplayString(__props.insuranceData.groupDiscountData?.currentTierData?.id),1),createBaseVNode(`span`,_hoisted_17$31,` - `+toDisplayString(__props.insuranceData.groupDiscountData?.currentTierData?.discount*100)+`% off `,1)],64)):createCommentVNode(``,!0)]),createBaseVNode(`div`,_hoisted_18$28,toDisplayString(__props.insuranceData.groupDiscountData?.secondaryText),1)])):createCommentVNode(``,!0),hasNoInsurance.value?createCommentVNode(``,!0):(openBlock(),createElementBlock(`div`,_hoisted_19$24,[createBaseVNode(`div`,_hoisted_20$20,[_cache[9]||=createBaseVNode(`span`,{class:`price-tile-title`},`Deductible`,-1),__props.insuranceData.baseDeductibledData?.oldPrice?(openBlock(),createElementBlock(`div`,_hoisted_21$18,[createBaseVNode(`div`,_hoisted_22$16,[createVNode(unref(bngUnit_default),{money:__props.insuranceData.baseDeductibledData.oldPrice},null,8,[`money`]),_cache[8]||=createBaseVNode(`div`,{class:`strike`},null,-1)])])):createCommentVNode(``,!0),createBaseVNode(`div`,_hoisted_23$15,[createVNode(unref(bngUnit_default),{money:__props.insuranceData.baseDeductibledData.price,class:normalizeClass(__props.insuranceData.baseDeductibledData.oldPrice?`green-price`:`orange-price`)},null,8,[`money`,`class`])]),_cache[10]||=createBaseVNode(`div`,{class:`deductible-tips`},[createBaseVNode(`div`,null,` - You pay your deductible for each crash repair `),createBaseVNode(`div`,null,` - Customize this value after purchase `)],-1),__props.insuranceData.baseDeductibledData.perkData?(openBlock(),createElementBlock(`div`,_hoisted_24$14,toDisplayString(__props.insuranceData.baseDeductibledData.perkData.discount*100)+`% discount applied `,1)):createCommentVNode(``,!0)]),createBaseVNode(`div`,_hoisted_25$13,[createBaseVNode(`span`,_hoisted_26$11,toDisplayString(__props.insuranceData.amountDue>0?`Amount Due`:`Credit Received`),1),createBaseVNode(`div`,_hoisted_27$11,[createVNode(unref(bngUnit_default),{money:Math.abs(__props.insuranceData.amountDue),class:`green-price`},null,8,[`money`])]),createBaseVNode(`div`,_hoisted_28$10,[createBaseVNode(`div`,null,[_cache[11]||=createTextVNode(` Total policy : `,-1),createVNode(unref(bngUnit_default),{money:__props.insuranceData.futurePremiumDetails.totalPriceWithDriverScore},null,8,[`money`])]),createBaseVNode(`div`,null,[_cache[12]||=createBaseVNode(`span`,null,`Renews in : `,-1),createBaseVNode(`span`,_hoisted_29$10,toDisplayString(renewsInFormatted.value),1)])])])]))]),createBaseVNode(`div`,{class:normalizeClass([`background`,{"no-insurance":hasNoInsurance.value}])},null,2)],6))}},insuranceCard_default=__plugin_vue_export_helper_default(_sfc_main$282,[[`__scopeId`,`data-v-e481fbef`]]),_hoisted_1$251={class:`premium-wrapper`},_hoisted_2$208={class:`breakdown-item`},_hoisted_3$182={class:`breakdown-item-value`},_hoisted_4$155={class:`premium-value-wrapper`},_hoisted_5$135={class:`breakdown-item`},_hoisted_6$116={class:`breakdown-item-value`},_hoisted_7$103={class:`breakdown-item`},_hoisted_8$87={class:`breakdown-item-value`},_hoisted_9$77={class:`breakdown-item`},_hoisted_10$67={class:`breakdown-item-value orange-text`},_hoisted_11$60={class:`perks`},_hoisted_12$49={key:0,class:`grey-text`},_hoisted_13$42={key:1,class:`grey-text`},_hoisted_14$39={class:`group-discount-savings`},_hoisted_15$37={class:`breakdown-item`},_hoisted_16$36={key:0,class:`grey-text`},_hoisted_17$30={key:1,class:`grey-text`},_hoisted_18$27={class:`buttons`},_sfc_main$281={__name:`smallInsuranceCard`,props:{insuranceData:{type:Object,required:!0},driverScoreData:{type:Object,required:!0}},setup(__props){let{units}=useBridge(),props=__props,renewsEveryFormatted=computed(()=>units.buildString(`length`,props.insuranceData.renewsEvery*1e3,0)),renewsInFormatted=computed(()=>units.buildString(`length`,props.insuranceData.renewsIn*1e3,0)),buttonsDisabled=computed(()=>props.insuranceData.carsInsuredCount===0),openVehicleList=()=>{addPopup(vehicleInsuranceList_default,{insuranceData:props.insuranceData,driverScoreData:props.driverScoreData})},openEditPolicy=()=>{addPopup(editPolicy_default,{insuranceData:props.insuranceData,driverScoreData:props.driverScoreData})},tierToDisplay=computed(()=>props.insuranceData.groupDiscountData.currentTierData.id>0?props.insuranceData.groupDiscountData.currentTierData:props.insuranceData.groupDiscountData.groupDiscountTiers[0]);return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,{class:normalizeClass([`small-insurance-card`,{"no-vehicles":buttonsDisabled.value}]),style:normalizeStyle({"border-top":`0.7rem solid ${props.insuranceData.color}`,background:`linear-gradient(180deg, ${props.insuranceData.color}80 0%, ${props.insuranceData.color}30 10%, ${props.insuranceData.color}10 35%, var(--bng-cool-gray-800) 50%, var(--blue-shade-100) 100%)`})},[createVNode(unref(insuranceIdentity_default),{class:`insurance-identity`,insuranceData:props.insuranceData},null,8,[`insuranceData`]),createBaseVNode(`div`,_hoisted_1$251,[createBaseVNode(`div`,_hoisted_2$208,[createBaseVNode(`span`,null,`Premium / `+toDisplayString(renewsEveryFormatted.value),1),createBaseVNode(`span`,_hoisted_3$182,[createBaseVNode(`div`,_hoisted_4$155,[createVNode(unref(bngUnit_default),{money:props.insuranceData.currentPremiumDetails.totalPriceWithDriverScore},null,8,[`money`])])])]),createBaseVNode(`div`,_hoisted_5$135,[_cache[0]||=createBaseVNode(`span`,null,`Renews in `,-1),createBaseVNode(`span`,_hoisted_6$116,[props.insuranceData.carsInsuredCount===0?(openBlock(),createElementBlock(Fragment,{key:0},[createTextVNode(` - `)],64)):(openBlock(),createElementBlock(Fragment,{key:1},[createTextVNode(toDisplayString(renewsInFormatted.value),1)],64))])]),createBaseVNode(`div`,_hoisted_7$103,[_cache[1]||=createBaseVNode(`span`,null,`Vehicle Coverage`,-1),createBaseVNode(`span`,_hoisted_8$87,[createVNode(unref(bngUnit_default),{money:props.insuranceData.totalInsuranceVehsValue},null,8,[`money`])])]),createBaseVNode(`div`,_hoisted_9$77,[_cache[2]||=createBaseVNode(`span`,null,`Vehicles`,-1),createBaseVNode(`span`,_hoisted_10$67,toDisplayString(props.insuranceData.carsInsuredCount),1)])]),createBaseVNode(`div`,_hoisted_11$60,[createVNode(unref(insurancePerks_default),{insuranceData:props.insuranceData,noDescription:!0},null,8,[`insuranceData`])]),createBaseVNode(`div`,{class:normalizeClass([`group-discount-wrapper`,{disabled:props.insuranceData.groupDiscountData.currentTierData.id===-1}])},[props.insuranceData.carsInsuredCount===0?(openBlock(),createElementBlock(`div`,_hoisted_12$49,` No vehicles insured under this policy `)):props.insuranceData.carsInsuredCount===1?(openBlock(),createElementBlock(`div`,_hoisted_13$42,` Add a second vehicle to unlock Tier 1 (`+toDisplayString(props.insuranceData.groupDiscountData.groupDiscountTiers[0].discount*100)+`%) coverage savings. `,1)):(openBlock(),createElementBlock(Fragment,{key:2},[_cache[4]||=createBaseVNode(`div`,{class:`group-discount`},` MULTI-VEHICLE DISCOUNT `,-1),createBaseVNode(`div`,_hoisted_14$39,[_cache[3]||=createTextVNode(` Savings :`,-1),createVNode(unref(bngUnit_default),{money:props.insuranceData.currentPremiumDetails.groupDiscountSavings},null,8,[`money`])]),createBaseVNode(`div`,_hoisted_15$37,[tierToDisplay.value.max?(openBlock(),createElementBlock(`span`,_hoisted_16$36,` Your coverage falls in the `+toDisplayString(tierToDisplay.value.min/1e3)+`k - `+toDisplayString(tierToDisplay.value.max/1e3)+`k range `,1)):(openBlock(),createElementBlock(`span`,_hoisted_17$30,` Your coverage falls in the `+toDisplayString(tierToDisplay.value.min/1e3)+`k+ range `,1))]),createBaseVNode(`div`,null,[createVNode(unref(insuranceTiers_default),{showTier:!0,tiers:props.insuranceData.groupDiscountData.groupDiscountTiers},null,8,[`tiers`])])],64))],2),createBaseVNode(`div`,_hoisted_18$27,[createVNode(unref(bngButton_default),{class:`edit-policy-button bigger-button`,accent:`custom`,onClick:openEditPolicy,disabled:buttonsDisabled.value},{default:withCtx(()=>[createVNode(unref(bngIcon_default),{class:normalizeClass([`button-icon`,{disabled:buttonsDisabled.value}]),type:unref(icons).adjust},null,8,[`type`,`class`]),createBaseVNode(`span`,{class:normalizeClass([`button-text`,{disabled:buttonsDisabled.value}])},`Edit Policy`,2)]),_:1},8,[`disabled`]),createVNode(unref(bngButton_default),{class:`see-vehicles-button bigger-button`,accent:`custom`,onClick:openVehicleList,disabled:buttonsDisabled.value},{default:withCtx(()=>[createVNode(unref(bngIcon_default),{class:normalizeClass([`button-icon`,{disabled:buttonsDisabled.value}]),type:unref(icons).car},null,8,[`type`,`class`]),createBaseVNode(`span`,{class:normalizeClass([`button-text`,{disabled:buttonsDisabled.value}])},`See Vehicles`,2)]),_:1},8,[`disabled`])])],6))}},smallInsuranceCard_default=__plugin_vue_export_helper_default(_sfc_main$281,[[`__scopeId`,`data-v-38392c0c`]]),_hoisted_1$250={class:`insurance-details-wrapper`,"bng-ui-scope":`insuranceDetailsPopup`},_hoisted_2$207={class:`card-content`},_hoisted_3$181={class:`header`},_hoisted_4$154={class:`header-left`},_hoisted_5$134={class:`insurance-identity`},_hoisted_6$115={class:`insurance-name`},_hoisted_7$102={class:`insurance-slogan`},_hoisted_8$86={class:`covers-renew-info`},_hoisted_9$76={class:`header-right`},_hoisted_10$66={class:`vehicle-name`},_hoisted_11$59={class:`vehicle-value blue-price`},_hoisted_12$48={key:0,class:`group-discount-wrapper`},_hoisted_13$41={class:`group-discount-header`},_hoisted_14$38={class:`group-discount-icon-wrapper`},_hoisted_15$36={class:`group-discount-text-wrapper`},_hoisted_16$35={class:`group-discount-main-text`},_hoisted_17$29={class:`tiers-wrapper`},_hoisted_18$26={class:`textual-tiers-wrapper`},_hoisted_19$23={class:`tier-number`},_hoisted_20$19={class:`money-bracket`},_hoisted_21$17={key:0},_hoisted_22$15={key:1},_hoisted_23$14={class:`current-after-discount-price`},_hoisted_24$13={class:`tier-discount-price`},_hoisted_25$12={class:`policy-value`},_hoisted_26$10={class:`policy-tier`},_hoisted_27$10={class:`tier-discount-price isFutureTier`},_hoisted_28$9={class:`policy-value`},_hoisted_29$9={class:`policy-tier isFuture`},_hoisted_30$9={class:`price-breakdown-wrapper`},_hoisted_31$9={class:`prices-breakdown-header`},_hoisted_32$9={class:`breakdown-item`},_hoisted_33$9={class:`breakdown-details`},_hoisted_34$9={class:`breakdown-item-value`},_hoisted_35$8={class:`breakdown-value`},_hoisted_36$8={class:`breakdown-item-value orange`},_hoisted_37$7={class:`breakdown-value`},_hoisted_38$6={key:0,class:`breakdown-item-value orange`},_hoisted_39$6={class:`breakdown-label`},_hoisted_40$5={class:`breakdown-value`},_hoisted_41$5={class:`breakdown-item-value result`},_hoisted_42$4={class:`breakdown-value result`},_hoisted_43$4={class:`breakdown-item`},_hoisted_44$4={class:`breakdown-details`},_hoisted_45$4={key:0,class:`breakdown-item-value`},_hoisted_46$2={key:0,class:`strikethrough-line`},_hoisted_47$2={key:1,class:`breakdown-item-value`},_hoisted_48$2={class:`breakdown-label`},_hoisted_49$2={class:`tier-discount-badge`},_hoisted_50$2={class:`breakdown-value green-price`},_hoisted_51$2={key:0,class:`breakdown-item-value`},_hoisted_52$2={class:`breakdown-label`},_hoisted_53$2={class:`breakdown-value`},_hoisted_54$2={class:`breakdown-item-value subtotal`},_hoisted_55$2={class:`breakdown-value`},_hoisted_56$2={class:`breakdown-item-value`},_hoisted_57$1={class:`breakdown-item-value result`},_hoisted_58$1={class:`breakdown-value`},_hoisted_59$1={class:`sum-to-pay`},_hoisted_60$1={class:`sum-to-pay-value`},_hoisted_61$1={class:`closeButton`},__default__$5={wrapper:{fade:!0,blur:!0,style:popupContainer.default},position:[popupPosition.center,popupPosition.center]},_sfc_main$280=Object.assign(__default__$5,{__name:`purchaseInsuranceDetails`,props:{insuranceData:Object,vehicleInfo:Object,driverScoreData:Object},emits:[`return`],setup(__props,{emit:__emit}){let{units}=useBridge();useUINavScope(`insuranceDetailsPopup`);let props=__props,emit$1=__emit,closePopup=()=>{emit$1(`return`,!0)},driverScoreAdjustmentText=computed(()=>{let multiplier=props.driverScoreData.tier.multiplier;return multiplier<1?`↓${((1-multiplier)*100).toFixed(0)}%`:multiplier>1?`↑${((multiplier-1)*100).toFixed(0)}%`:`0%`}),driverScoreClass=computed(()=>{let multiplier=props.driverScoreData.tier.multiplier;return multiplier<1?`driver-score-discount`:multiplier>1?`driver-score-penalty`:``}),groupDiscountText=computed(()=>{if(props.insuranceData.groupDiscountData){if(props.insuranceData.groupDiscountData.willHaveGroupDiscountForTheFirstTime)return`Multi-vehicle discount available`;if(props.insuranceData.groupDiscountData.willBumpTheirDiscount)return`Bigger discount available`;if(props.insuranceData.groupDiscountData.currentTierData&&props.insuranceData.groupDiscountData.currentTierData.id>0)return`Multi-vehicle discount active`}return null}),renewsEveryFormatted=computed(()=>props.insuranceData?.renewsEvery?units.buildString(`length`,props.insuranceData.renewsEvery*1e3,0):``);return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$250,[createBaseVNode(`div`,_hoisted_2$207,[createBaseVNode(`div`,_hoisted_3$181,[createBaseVNode(`div`,_hoisted_4$154,[_cache[2]||=createBaseVNode(`div`,{class:`policy-details`},` Policy details `,-1),createBaseVNode(`div`,_hoisted_5$134,[createBaseVNode(`span`,_hoisted_6$115,toDisplayString(props.insuranceData.name),1),_cache[0]||=createBaseVNode(`span`,{class:`name-slogan-seperator`},null,-1),createBaseVNode(`span`,_hoisted_7$102,toDisplayString(props.insuranceData.slogan),1)]),createBaseVNode(`div`,_hoisted_8$86,[createBaseVNode(`span`,null,`Covers `+toDisplayString(props.insuranceData.carsInsuredCount)+` Vehicles`,1),_cache[1]||=createBaseVNode(`span`,{class:`covers-renew-seperator`},null,-1),createBaseVNode(`span`,null,`Renews every `+toDisplayString(renewsEveryFormatted.value),1)])]),createBaseVNode(`div`,_hoisted_9$76,[_cache[4]||=createBaseVNode(`div`,{class:`action-type`},`Adding vehicle`,-1),createBaseVNode(`div`,_hoisted_10$66,toDisplayString(props.vehicleInfo.Name),1),createBaseVNode(`div`,_hoisted_11$59,[_cache[3]||=createTextVNode(`Value : `,-1),createVNode(unref(bngUnit_default),{money:props.vehicleInfo.Value},null,8,[`money`])])])]),props.insuranceData.groupDiscountData.willHaveGroupDiscountForTheFirstTime||props.insuranceData.groupDiscountData.willBumpTheirDiscount||props.insuranceData.groupDiscountData.currentTierData.id>0?(openBlock(),createElementBlock(`div`,_hoisted_12$48,[createBaseVNode(`div`,_hoisted_13$41,[createBaseVNode(`div`,_hoisted_14$38,[createVNode(unref(bngIcon_default),{type:unref(icons).checkmark},null,8,[`type`])]),createBaseVNode(`div`,_hoisted_15$36,[createBaseVNode(`div`,_hoisted_16$35,toDisplayString(groupDiscountText.value),1),_cache[5]||=createBaseVNode(`div`,{class:`group-discount-secondary-text`},` Insurance discounts are based on the total value of your fleet. `,-1)])]),createBaseVNode(`div`,_hoisted_17$29,[createBaseVNode(`div`,_hoisted_18$26,[(openBlock(!0),createElementBlock(Fragment,null,renderList(props.insuranceData.groupDiscountData.groupDiscountTiers,tier=>(openBlock(),createElementBlock(`div`,{class:`tier`,key:tier.id},[createBaseVNode(`div`,_hoisted_19$23,` Tier `+toDisplayString(tier.id),1),createBaseVNode(`div`,_hoisted_20$19,[createBaseVNode(`span`,null,toDisplayString(tier.min/1e3)+`k`,1),tier.max?(openBlock(),createElementBlock(`span`,_hoisted_21$17,`-`+toDisplayString(tier.max/1e3)+`k`,1)):(openBlock(),createElementBlock(`span`,_hoisted_22$15,`+`))])]))),128))]),createVNode(unref(insuranceTiers_default),{tiers:props.insuranceData.groupDiscountData.groupDiscountTiers},null,8,[`tiers`])]),createBaseVNode(`div`,_hoisted_23$14,[createBaseVNode(`div`,_hoisted_24$13,[_cache[7]||=createBaseVNode(`div`,{class:`section-label deactivated`},` Current Tier `,-1),createBaseVNode(`div`,_hoisted_25$12,[_cache[6]||=createTextVNode(` Policy Value : `,-1),createVNode(unref(bngUnit_default),{money:props.insuranceData.totalInsuranceVehsValue},null,8,[`money`])]),createBaseVNode(`div`,_hoisted_26$10,` Tier `+toDisplayString(Math.max(props.insuranceData.groupDiscountData.currentTierData.id,0))+` - `+toDisplayString(props.insuranceData.groupDiscountData.currentTierData.discount*100)+`% off `,1)]),createBaseVNode(`div`,_hoisted_27$10,[_cache[9]||=createBaseVNode(`div`,{class:`section-label`},` After Purchase `,-1),createBaseVNode(`div`,_hoisted_28$9,[_cache[8]||=createTextVNode(` Policy Value : `,-1),createVNode(unref(bngUnit_default),{money:props.insuranceData.totalInsuranceVehsValue+props.insuranceData.vehicleValue},null,8,[`money`])]),createBaseVNode(`div`,_hoisted_29$9,` Tier `+toDisplayString(props.insuranceData.groupDiscountData.futureTierData.id)+` - `+toDisplayString(props.insuranceData.groupDiscountData.futureTierData.discount*100)+`% off `,1)])])])):createCommentVNode(``,!0),createBaseVNode(`div`,_hoisted_30$9,[createBaseVNode(`div`,_hoisted_31$9,[createBaseVNode(`div`,_hoisted_32$9,[_cache[13]||=createBaseVNode(`div`,{class:`section-label`},` Vehicle `,-1),createBaseVNode(`div`,_hoisted_33$9,[createBaseVNode(`div`,_hoisted_34$9,[_cache[10]||=createBaseVNode(`span`,{class:`breakdown-label`},` Coverage Cost `,-1),createBaseVNode(`span`,_hoisted_35$8,[createVNode(unref(bngUnit_default),{money:props.insuranceData.nonProRatedVehiclePremium},null,8,[`money`])])]),createBaseVNode(`div`,_hoisted_36$8,[_cache[11]||=createBaseVNode(`span`,{class:`breakdown-label`},` Pro-rated Renewal `,-1),createBaseVNode(`span`,_hoisted_37$7,` × `+toDisplayString(props.insuranceData.proRatedPercentage)+`% `,1)]),props.insuranceData.groupDiscountData?.currentTierData.id>0?(openBlock(),createElementBlock(`div`,_hoisted_38$6,[createBaseVNode(`span`,_hoisted_39$6,` Tier `+toDisplayString(props.insuranceData.groupDiscountData?.currentTierData.id)+` discount `,1),createBaseVNode(`span`,_hoisted_40$5,` - `+toDisplayString(props.insuranceData.groupDiscountData?.currentTierData.discount*100)+`% `,1)])):createCommentVNode(``,!0),createBaseVNode(`div`,_hoisted_41$5,[_cache[12]||=createBaseVNode(`span`,{class:`breakdown-label`},` Policy Add-On Cost `,-1),createBaseVNode(`span`,_hoisted_42$4,[createVNode(unref(bngUnit_default),{money:props.insuranceData.proRatedVehiclePremium},null,8,[`money`])])])])]),createBaseVNode(`div`,_hoisted_43$4,[_cache[18]||=createBaseVNode(`div`,{class:`section-label`},` New Premium `,-1),createBaseVNode(`div`,_hoisted_44$4,[props.insuranceData.futurePremiumDetails.items.vehsCoverage?(openBlock(),createElementBlock(`div`,_hoisted_45$4,[_cache[14]||=createBaseVNode(`div`,{class:`breakdown-label`},` Vehicles Coverage `,-1),createBaseVNode(`div`,{class:normalizeClass([`breakdown-value strikethrough-container`,{"strikethrough-grey":props.insuranceData.futurePremiumDetails.groupDiscountSavings>0}])},[createVNode(unref(bngUnit_default),{money:props.insuranceData.futurePremiumDetails.items.vehsCoverage.priceWithoutGroupDiscount},null,8,[`money`]),props.insuranceData.futurePremiumDetails.groupDiscountSavings>0?(openBlock(),createElementBlock(`div`,_hoisted_46$2)):createCommentVNode(``,!0)],2)])):createCommentVNode(``,!0),props.insuranceData.futurePremiumDetails.items.vehsCoverage&&props.insuranceData.futurePremiumDetails.groupDiscountSavings>0?(openBlock(),createElementBlock(`div`,_hoisted_47$2,[createBaseVNode(`div`,_hoisted_48$2,[createTextVNode(toDisplayString(props.insuranceData.futurePremiumDetails.items.vehsCoverage.name)+` `,1),createBaseVNode(`span`,null,[createTextVNode(`: Tier `+toDisplayString(props.insuranceData.groupDiscountData.currentTierData.id)+` `,1),createBaseVNode(`span`,_hoisted_49$2,`(`+toDisplayString(props.insuranceData.groupDiscountData.currentTierData.discount*100)+`% off)`,1)])]),createBaseVNode(`div`,_hoisted_50$2,[createVNode(unref(bngUnit_default),{money:props.insuranceData.futurePremiumDetails.items.vehsCoverage.price},null,8,[`money`])])])):createCommentVNode(``,!0),(openBlock(!0),createElementBlock(Fragment,null,renderList(props.insuranceData.futurePremiumDetails.items,(item,key)=>(openBlock(),createElementBlock(Fragment,{key},[key===`vehsCoverage`?createCommentVNode(``,!0):(openBlock(),createElementBlock(`div`,_hoisted_51$2,[createBaseVNode(`div`,_hoisted_52$2,toDisplayString(item.name),1),createBaseVNode(`div`,_hoisted_53$2,[createVNode(unref(bngUnit_default),{money:item.price},null,8,[`money`])])]))],64))),128)),createBaseVNode(`div`,_hoisted_54$2,[_cache[15]||=createBaseVNode(`div`,{class:`breakdown-label`},` Subtotal `,-1),createBaseVNode(`div`,_hoisted_55$2,[createVNode(unref(bngUnit_default),{money:props.insuranceData.futurePremiumDetails.totalPrice},null,8,[`money`])])]),createBaseVNode(`div`,_hoisted_56$2,[_cache[16]||=createBaseVNode(`div`,{class:`breakdown-label`},` Driver Score Adjustment `,-1),createBaseVNode(`div`,{class:normalizeClass([`breakdown-value`,driverScoreClass.value])},toDisplayString(driverScoreAdjustmentText.value),3)]),createBaseVNode(`div`,_hoisted_57$1,[_cache[17]||=createBaseVNode(`div`,{class:`breakdown-label`},` Total Premium `,-1),createBaseVNode(`div`,_hoisted_58$1,[createVNode(unref(bngUnit_default),{money:props.insuranceData.futurePremiumDetails.totalPriceWithDriverScore},null,8,[`money`])])])])])]),createBaseVNode(`div`,_hoisted_59$1,[_cache[19]||=createBaseVNode(`span`,null,`Amount due today`,-1),createBaseVNode(`span`,_hoisted_60$1,[createVNode(unref(bngUnit_default),{class:`green-price`,money:props.insuranceData.addVehiclePrice},null,8,[`money`])])])]),createBaseVNode(`div`,_hoisted_61$1,[createVNode(unref(bngButton_default),{accent:unref(ACCENTS).primary,onClick:closePopup},{default:withCtx(()=>[..._cache[20]||=[createTextVNode(` Close `,-1)]]),_:1},8,[`accent`])])])]))}}),purchaseInsuranceDetails_default=__plugin_vue_export_helper_default(_sfc_main$280,[[`__scopeId`,`data-v-9f20c127`]]),_hoisted_1$249={class:`content`},_hoisted_2$206={class:`top-banner`},_hoisted_3$180={class:`top-banner-left`},_hoisted_4$153={class:`insurance-details`},_hoisted_5$133={class:`insurance-name`},_hoisted_6$114={class:`insurance-slogan`},_hoisted_7$101={class:`small-grey-text`},_hoisted_8$85={class:`small-grey-text`},_hoisted_9$75={class:`top-banner-right`},_hoisted_10$65={class:`information-wrapper`},_hoisted_11$58={class:`information-value`},_hoisted_12$47={class:`driver-score-tier`},_hoisted_13$40={class:`premium-effect`},_hoisted_14$37={class:`switching-details-wrapper`},_hoisted_15$35={class:`three-columns-grid`},_hoisted_16$34={class:`switching-column column-leaving`},_hoisted_17$28={class:`column-header`},_hoisted_18$25={class:`column-details`},_hoisted_19$22={class:`detail-item`},_hoisted_20$18={class:`detail-value`},_hoisted_21$16={class:`detail-item`},_hoisted_22$14={class:`detail-item divider-above`},_hoisted_23$13={class:`detail-value-positive`},_hoisted_24$12={class:`detail-item`},_hoisted_25$11={class:`detail-value-negative`},_hoisted_26$9={class:`detail-item divider-above`},_hoisted_27$9={class:`detail-value-positive-bold`},_hoisted_28$8={class:`detail-note`},_hoisted_29$8={class:`switching-column column-vehicle`},_hoisted_30$8={class:`vehicle-display-box`},_hoisted_31$8=[`src`],_hoisted_32$8={class:`column-details`},_hoisted_33$8={class:`detail-item`},_hoisted_34$8={class:`detail-value-bold`},_hoisted_35$7={class:`detail-item`},_hoisted_36$7={class:`detail-value-bold`},_hoisted_37$6={class:`detail-item divider-above`},_hoisted_38$5={class:`detail-value-highlight`},_hoisted_39$5={class:`detail-note`},_hoisted_40$4={class:`switching-column column-joining`},_hoisted_41$4={class:`column-header`},_hoisted_42$3={class:`column-details`},_hoisted_43$3={class:`detail-item`},_hoisted_44$3={class:`detail-value`},_hoisted_45$3={class:`detail-item`},_hoisted_46$1={class:`detail-item divider-above`},_hoisted_47$1={class:`detail-value-negative`},_hoisted_48$1={class:`detail-item divider-above`},_hoisted_49$1={class:`detail-item divider-above`},_hoisted_50$1={class:`detail-value-bold`},_hoisted_51$1={class:`detail-note`},_hoisted_52$1={class:`final-amount-content-row`},_hoisted_53$1={class:`final-amount-label`},_hoisted_54$1={class:`final-amount-breakdown`},_hoisted_55$1={class:`buttons`},_hoisted_56$1={key:0},_sfc_main$279={__name:`changeInsuranceDetails`,props:{insuranceData:{type:Object,required:!0},vehicleInfo:{type:Object,default:()=>({})},driverScoreData:{type:Object,default:()=>({})}},emits:[`return`,`switch`],setup(__props,{emit:__emit}){let{units}=useBridge(),props=__props,emit$1=__emit,premiumSavingPercent=computed(()=>(1-(props.driverScoreData?.tier?.multiplier||1))*100),leavingInfo=computed(()=>props.insuranceData.leavingInsuranceInfo||null),leavingInsuranceName=computed(()=>leavingInfo.value?.currentInsuranceName||`Current Insurance`),tierDropped=computed(()=>leavingInfo.value?leavingInfo.value.discountTierData?.id>leavingInfo.value.newDiscountTierData?.id:!1),tierIncreased=computed(()=>{let current=props.insuranceData.groupDiscountData?.currentTierData?.id||0;return(props.insuranceData.groupDiscountData?.futureTierData?.id||current)>current}),currentTierId=computed(()=>props.insuranceData.groupDiscountData?.currentTierData?.id||0),futureTierId=computed(()=>props.insuranceData.groupDiscountData?.futureTierData?.id||props.insuranceData.groupDiscountData?.currentTierData?.id||0),proRatedPercentage=computed(()=>Math.round(props.insuranceData.proRatedPercentage||100)),driverScoreImpactPercent=computed(()=>(1-(props.driverScoreData?.tier?.multiplier||1))*100),driverScoreImpactClass=computed(()=>driverScoreImpactPercent.value>0?`saving`:driverScoreImpactPercent.value<0?`increase`:`neutral`),driverScoreImpactText=computed(()=>driverScoreImpactPercent.value>0?`↓${driverScoreImpactPercent.value.toFixed(0)}%`:driverScoreImpactPercent.value<0?`↑${Math.abs(driverScoreImpactPercent.value).toFixed(0)}%`:`0%`),renewsEveryFormatted=computed(()=>props.insuranceData?.renewsEvery?units.buildString(`length`,props.insuranceData.renewsEvery*1e3,0):``),renewsInFormatted=computed(()=>props.insuranceData?.renewsIn?units.buildString(`length`,props.insuranceData.renewsIn*1e3,0):``),leavingRenewsInFormatted=computed(()=>leavingInfo.value?.renewsIn?units.buildString(`length`,leavingInfo.value.renewsIn*1e3,0):``),closePopup=()=>{emit$1(`return`,!0)},onSwitchClick=()=>{Lua_default.career_modules_insurance_insurance.changeInvVehInsurance(props.vehicleInfo.invVehId,props.insuranceData.id),emit$1(`return`,!0)};return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$249,[createBaseVNode(`div`,_hoisted_2$206,[createBaseVNode(`div`,_hoisted_3$180,[_cache[2]||=createBaseVNode(`div`,{class:`title`},` Change Insurance `,-1),createBaseVNode(`div`,_hoisted_4$153,[createBaseVNode(`span`,_hoisted_5$133,toDisplayString(props.insuranceData.name),1),_cache[0]||=createBaseVNode(`span`,{class:`name-slogan-seperator`},null,-1),createBaseVNode(`span`,_hoisted_6$114,` "`+toDisplayString(props.insuranceData.slogan)+`" `,1)]),createBaseVNode(`div`,null,[createBaseVNode(`span`,_hoisted_7$101,` Covers `+toDisplayString(props.insuranceData.carsInsuredCount)+` Vehicles `,1),_cache[1]||=createBaseVNode(`span`,{class:`dot-seperator`},null,-1),createBaseVNode(`span`,_hoisted_8$85,` Renews every `+toDisplayString(renewsEveryFormatted.value),1)])]),createBaseVNode(`div`,_hoisted_9$75,[createBaseVNode(`div`,_hoisted_10$65,[_cache[4]||=createBaseVNode(`div`,{class:`small-grey-text`},` Driver Score `,-1),createBaseVNode(`div`,_hoisted_11$58,toDisplayString(props.driverScoreData.score)+`: `+toDisplayString(props.driverScoreData.tier.risk),1),createBaseVNode(`div`,_hoisted_12$47,toDisplayString(props.driverScoreData.tier.name),1),createBaseVNode(`div`,_hoisted_13$40,[_cache[3]||=createBaseVNode(`span`,{class:`small-grey-text`},` Premium Effect : `,-1),createBaseVNode(`span`,{class:normalizeClass([`premium-effect-value`,{saving:premiumSavingPercent.value>0,increase:premiumSavingPercent.value<0}])},toDisplayString(premiumSavingPercent.value>0?`${premiumSavingPercent.value.toFixed(0)}% saving`:premiumSavingPercent.value<0?`${Math.abs(premiumSavingPercent.value).toFixed(0)}% increase`:`No change`),3)])])])]),createBaseVNode(`div`,_hoisted_14$37,[createBaseVNode(`div`,_hoisted_15$35,[createBaseVNode(`div`,_hoisted_16$34,[createBaseVNode(`div`,_hoisted_17$28,[_cache[5]||=createBaseVNode(`span`,null,`←`,-1),createTextVNode(` Leaving `+toDisplayString(leavingInsuranceName.value),1)]),createBaseVNode(`div`,_hoisted_18$25,[createBaseVNode(`div`,_hoisted_19$22,[_cache[6]||=createBaseVNode(`span`,{class:`detail-label`},`Vehicles:`,-1),createBaseVNode(`span`,_hoisted_20$18,toDisplayString(leavingInfo.value.vehicleCount)+` → `+toDisplayString(leavingInfo.value.newVehicleCount),1)]),createBaseVNode(`div`,_hoisted_21$16,[_cache[7]||=createBaseVNode(`span`,{class:`detail-label`},`Discount Tier:`,-1),createBaseVNode(`span`,{class:normalizeClass([`detail-value`,{"tier-change-down":tierDropped.value}])},toDisplayString(leavingInfo.value.discountTierData.id)+` → `+toDisplayString(leavingInfo.value.newDiscountTierData.id),3)]),createBaseVNode(`div`,_hoisted_22$14,[_cache[9]||=createBaseVNode(`span`,{class:`detail-label`},`Coverage refund:`,-1),createBaseVNode(`span`,_hoisted_23$13,[_cache[8]||=createTextVNode(`+`,-1),createVNode(unref(bngUnit_default),{money:leavingInfo.value.coverageRefundPrice},null,8,[`money`])])]),createBaseVNode(`div`,_hoisted_24$12,[_cache[11]||=createBaseVNode(`span`,{class:`detail-label`},`Cancellation fee (25%):`,-1),createBaseVNode(`span`,_hoisted_25$11,[_cache[10]||=createTextVNode(`-`,-1),createVNode(unref(bngUnit_default),{money:leavingInfo.value.earlyTerminationPenalty},null,8,[`money`])])]),createBaseVNode(`div`,_hoisted_26$9,[_cache[12]||=createBaseVNode(`span`,{class:`detail-label-bold`},`Net Refund:`,-1),createBaseVNode(`span`,_hoisted_27$9,[createVNode(unref(bngUnit_default),{money:leavingInfo.value.netRefundPrice},null,8,[`money`])])]),createBaseVNode(`div`,_hoisted_28$8,toDisplayString(leavingRenewsInFormatted.value)+` unused `,1)])]),createBaseVNode(`div`,_hoisted_29$8,[_cache[16]||=createBaseVNode(`div`,{class:`column-header column-header-center`},`Moving Vehicle`,-1),createBaseVNode(`div`,_hoisted_30$8,[createBaseVNode(`img`,{src:props.vehicleInfo?.thumbnail,alt:``,class:`vehicle-thumbnail`},null,8,_hoisted_31$8)]),createBaseVNode(`div`,_hoisted_32$8,[createBaseVNode(`div`,_hoisted_33$8,[_cache[13]||=createBaseVNode(`span`,{class:`detail-label`},`Vehicle:`,-1),createBaseVNode(`span`,_hoisted_34$8,toDisplayString(props.vehicleInfo.Name),1)]),createBaseVNode(`div`,_hoisted_35$7,[_cache[14]||=createBaseVNode(`span`,{class:`detail-label`},`Value:`,-1),createBaseVNode(`span`,_hoisted_36$7,[createVNode(unref(bngUnit_default),{money:props.vehicleInfo.Value},null,8,[`money`])])]),createBaseVNode(`div`,_hoisted_37$6,[_cache[15]||=createBaseVNode(`span`,{class:`detail-label`},`Joining mid-cycle:`,-1),createBaseVNode(`span`,_hoisted_38$5,`× `+toDisplayString(proRatedPercentage.value)+`%`,1)]),createBaseVNode(`div`,_hoisted_39$5,toDisplayString(renewsInFormatted.value)+` remaining in cycle `,1)])]),createBaseVNode(`div`,_hoisted_40$4,[createBaseVNode(`div`,_hoisted_41$4,[createTextVNode(` Joining `+toDisplayString(props.insuranceData.name)+` `,1),_cache[17]||=createBaseVNode(`span`,null,`→`,-1)]),createBaseVNode(`div`,_hoisted_42$3,[createBaseVNode(`div`,_hoisted_43$3,[_cache[18]||=createBaseVNode(`span`,{class:`detail-label`},`Vehicles:`,-1),createBaseVNode(`span`,_hoisted_44$3,toDisplayString(props.insuranceData.carsInsuredCount)+` → `+toDisplayString(props.insuranceData.carsInsuredCount+1),1)]),createBaseVNode(`div`,_hoisted_45$3,[_cache[19]||=createBaseVNode(`span`,{class:`detail-label`},`Discount Tier:`,-1),createBaseVNode(`span`,{class:normalizeClass([`detail-value`,{"tier-change-up":tierIncreased.value}])},toDisplayString(currentTierId.value)+` → `+toDisplayString(futureTierId.value),3)]),createBaseVNode(`div`,_hoisted_46$1,[_cache[21]||=createBaseVNode(`span`,{class:`detail-label`},`Add vehicle cost:`,-1),createBaseVNode(`span`,_hoisted_47$1,[_cache[20]||=createTextVNode(`+`,-1),createVNode(unref(bngUnit_default),{money:props.insuranceData.addVehiclePrice},null,8,[`money`])])]),createBaseVNode(`div`,_hoisted_48$1,[_cache[22]||=createBaseVNode(`span`,{class:`detail-label`},`Driver Score Impact:`,-1),createBaseVNode(`span`,{class:normalizeClass([`detail-value-impact`,driverScoreImpactClass.value])},toDisplayString(driverScoreImpactText.value),3)]),createBaseVNode(`div`,_hoisted_49$1,[_cache[23]||=createBaseVNode(`span`,{class:`detail-label-bold`},`New Policy Premium:`,-1),createBaseVNode(`span`,_hoisted_50$1,[createVNode(unref(bngUnit_default),{money:props.insuranceData.futurePremiumDetails.totalPriceWithDriverScore},null,8,[`money`])])]),createBaseVNode(`div`,_hoisted_51$1,toDisplayString(renewsInFormatted.value)+` until renewal `,1)])])]),createBaseVNode(`div`,{class:normalizeClass([`final-amount-box`,props.insuranceData.netSwitchingCost>0?`amount-credit`:`amount-payment`])},[createBaseVNode(`div`,_hoisted_52$1,[createBaseVNode(`div`,null,[createBaseVNode(`div`,_hoisted_53$1,toDisplayString(props.insuranceData.netSwitchingCost>0?`Credit Received Today`:`Amount Due Today`),1),createBaseVNode(`div`,_hoisted_54$1,[createVNode(unref(bngUnit_default),{money:leavingInfo.value.netRefundPrice},null,8,[`money`]),_cache[24]||=createTextVNode(` refund - `,-1),createVNode(unref(bngUnit_default),{money:props.insuranceData.addVehiclePrice},null,8,[`money`]),_cache[25]||=createTextVNode(` new cost `,-1)])]),createBaseVNode(`div`,{class:normalizeClass([`final-amount-total`,props.insuranceData.netSwitchingCost<0?`negative`:`positive`])},[createVNode(unref(bngUnit_default),{money:Math.abs(props.insuranceData.netSwitchingCost)},null,8,[`money`])],2)])],2)]),createBaseVNode(`div`,_hoisted_55$1,[createVNode(unref(bngButton_default),{class:`gray-button bigger-button`,accent:`custom`,onClick:closePopup},{default:withCtx(()=>[..._cache[26]||=[createTextVNode(` Cancel `,-1)]]),_:1}),createVNode(unref(bngButton_default),{class:`save-button bigger-button`,accent:`custom`,onClick:onSwitchClick},{default:withCtx(()=>[_cache[27]||=createTextVNode(` Switch for `,-1),props.insuranceData.netSwitchingCost<0?(openBlock(),createElementBlock(`div`,_hoisted_56$1,[createVNode(unref(bngUnit_default),{money:Math.abs(props.insuranceData.netSwitchingCost)},null,8,[`money`])])):createCommentVNode(``,!0)]),_:1})])]))}},changeInsuranceDetails_default=__plugin_vue_export_helper_default(_sfc_main$279,[[`__scopeId`,`data-v-9624a106`]]),_hoisted_1$248={class:`insurance-tiers`},_hoisted_2$205={key:0},_sfc_main$278={__name:`insuranceTiers`,props:{tiers:{type:Array,required:!0},showTier:{type:Boolean,default:!1}},setup(__props){let props=__props;return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$248,[(openBlock(!0),createElementBlock(Fragment,null,renderList(props.tiers,tier=>(openBlock(),createElementBlock(`div`,{class:`tier`,key:tier.id},[createBaseVNode(`div`,{class:normalizeClass([`tier-discount`,{isCurrent:tier.isCurrent}])},[props.showTier?(openBlock(),createElementBlock(`div`,_hoisted_2$205,` Tier `+toDisplayString(tier.id),1)):createCommentVNode(``,!0),createBaseVNode(`div`,null,toDisplayString(tier.discount*100)+`% `,1)],2)]))),128))]))}},insuranceTiers_default=__plugin_vue_export_helper_default(_sfc_main$278,[[`__scopeId`,`data-v-ccd1e875`]]),_hoisted_1$247={class:`popup-content`},_hoisted_2$204={class:`top-banner`},_hoisted_3$179={class:`top-info`},_hoisted_4$152={class:`top-info-title`},_hoisted_5$132={class:`top-info-policy-name`},_hoisted_6$113={class:`customize-coverage section`},_hoisted_7$100={class:`premium-details section`},_hoisted_8$84={class:`premium-details-content`},_hoisted_9$74={class:`premium-details-left`},_hoisted_10$64={class:`premium-details-label`},_hoisted_11$57={class:`premium-details-right`},_hoisted_12$46={key:0,class:`price-diff-container`},_hoisted_13$39={class:`premium-details-total premium-details-item`},_hoisted_14$36={class:`premium-details-left`},_hoisted_15$34={class:`driver-score-details-wrapper`},_hoisted_16$33={class:`driver-score-details`},_hoisted_17$27={class:`premium-details-right`},_hoisted_18$24={key:0,class:`price-diff-container`},_hoisted_19$21={class:`buttons`},_sfc_main$277={__name:`editPolicy`,props:{insuranceData:{type:Object,required:!0},driverScoreData:{type:Object,required:!0}},emits:[`return`],setup(__props,{emit:__emit}){let props=__props,changedCoverageOptions=ref({}),newPremiumDetails=ref({}),computedNewPremiumDiffs=computed(()=>{if(!newPremiumDetails.value?.items)return{};let diffs={};for(let key in newPremiumDetails.value.items){let newPrice=newPremiumDetails.value.items[key]?.price||0,oldPrice=props.insuranceData.currentPremiumDetails.items[key]?.price||0;diffs[key]={priceDiff:newPrice-oldPrice,newPrice,oldPrice}}return diffs}),computedTotalPriceDiff=computed(()=>newPremiumDetails.value?.totalPrice?newPremiumDetails.value.totalPrice-props.insuranceData.currentPremiumDetails.totalPrice:0),driverScoreColorClass=computed(()=>{let multiplier=props.driverScoreData?.tier?.multiplier;return multiplier?multiplier<1?`driver-score-good`:multiplier>1?`driver-score-bad`:``:``}),hasChangedCoverageOptions=computed(()=>props.insuranceData?.coverageOptionsData?props.insuranceData.coverageOptionsData.some(option=>changedCoverageOptions.value[option.key]!==option.currentValueId):!1);onMounted(()=>{props.insuranceData?.coverageOptionsData&&props.insuranceData.coverageOptionsData.forEach(option=>{changedCoverageOptions.value[option.key]=option.currentValueId})});let emit$1=__emit,closePopup=()=>{emit$1(`return`,!0)},openVehicleList=()=>{addPopup(vehicleInsuranceList_default,{insuranceData:props.insuranceData,driverScoreData:props.driverScoreData}),closePopup()},onSaveClick=()=>{Lua_default.career_modules_insurance_insurance.saveNewInsuranceCoverageOptions(props.insuranceData.id,changedCoverageOptions.value),emit$1(`return`,!0)},updatePremiumDetails=async()=>{newPremiumDetails.value=await Lua_default.career_modules_insurance_insurance.calculateInsurancePremium(props.insuranceData.id,changedCoverageOptions.value,null)},onToggleChange=(coverageOption,newValue)=>{let targetChoiceIndex=coverageOption.choices.findIndex(choice=>choice.value===newValue);targetChoiceIndex!==-1&&(changedCoverageOptions.value[coverageOption.key]=targetChoiceIndex+1,updatePremiumDetails())},onChoiceClick=(coverageOption,choice)=>{changedCoverageOptions.value[coverageOption.key]=choice.id,updatePremiumDetails()};return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$247,[createBaseVNode(`div`,_hoisted_2$204,[createBaseVNode(`div`,_hoisted_3$179,[createBaseVNode(`div`,_hoisted_4$152,[_cache[0]||=createTextVNode(` Edit Policy: `,-1),createBaseVNode(`span`,_hoisted_5$132,toDisplayString(props.insuranceData.name),1)]),_cache[1]||=createBaseVNode(`div`,{class:`top-info-description`},` These settings apply to all vehicles under this policy. Set deductibles per vehicle by clicking "Edit Vehicles" `,-1)]),createVNode(unref(bngButton_default),{class:`edit-vehicles-button`,accent:`custom`,onClick:openVehicleList},{default:withCtx(()=>[..._cache[2]||=[createTextVNode(` Edit Vehicles `,-1)]]),_:1})]),createBaseVNode(`div`,_hoisted_6$113,[(openBlock(!0),createElementBlock(Fragment,null,renderList(props.insuranceData.coverageOptionsData,coverageOption=>(openBlock(),createBlock(unref(coverageOption_default),{key:coverageOption.name,coverageOption,changedCoverageOptions:changedCoverageOptions.value,onChoiceClick,onToggleChange},null,8,[`coverageOption`,`changedCoverageOptions`]))),128))]),createBaseVNode(`div`,_hoisted_7$100,[_cache[5]||=createBaseVNode(`div`,{class:`premium-details-header`},` Premium Breakdown `,-1),createBaseVNode(`div`,_hoisted_8$84,[(openBlock(!0),createElementBlock(Fragment,null,renderList(props.insuranceData.currentPremiumDetails.items,(detail,key)=>(openBlock(),createElementBlock(`div`,{class:`premium-details-item`,key},[createBaseVNode(`div`,_hoisted_9$74,[createBaseVNode(`div`,_hoisted_10$64,toDisplayString(detail.name),1)]),createBaseVNode(`div`,_hoisted_11$57,[computedNewPremiumDiffs.value[key]&&computedNewPremiumDiffs.value[key].priceDiff!==0?(openBlock(),createElementBlock(`div`,_hoisted_12$46,[createBaseVNode(`span`,{class:normalizeClass([`arrow`,{"green-price":computedNewPremiumDiffs.value[key].priceDiff<0,"red-price":computedNewPremiumDiffs.value[key].priceDiff>0}])},toDisplayString(computedNewPremiumDiffs.value[key].priceDiff>0?`↑`:`↓`),3),createVNode(unref(bngUnit_default),{class:normalizeClass([`price-diff`,{"green-price":computedNewPremiumDiffs.value[key].priceDiff<0,"red-price":computedNewPremiumDiffs.value[key].priceDiff>0}]),money:computedNewPremiumDiffs.value[key].priceDiff},null,8,[`class`,`money`])])):createCommentVNode(``,!0),createVNode(unref(bngUnit_default),{money:newPremiumDetails.value?.items?.[key]?.price||detail.price},null,8,[`money`])])]))),128)),createBaseVNode(`div`,_hoisted_13$39,[createBaseVNode(`div`,_hoisted_14$36,[_cache[4]||=createBaseVNode(`div`,null,` Final Premium `,-1),createBaseVNode(`div`,_hoisted_15$34,[createBaseVNode(`span`,_hoisted_16$33,[_cache[3]||=createTextVNode(` Base Premium : `,-1),createVNode(unref(bngUnit_default),{money:props.insuranceData.currentPremiumDetails.totalPrice},null,8,[`money`]),createTextVNode(` × Driver Score `+toDisplayString(props.driverScoreData.score)+` @ `,1)]),createBaseVNode(`span`,{class:normalizeClass([`driver-score`,driverScoreColorClass.value])},toDisplayString(Math.round(props.driverScoreData.tier.multiplier*100))+`% `,3)])]),createBaseVNode(`div`,_hoisted_17$27,[computedTotalPriceDiff.value===0?createCommentVNode(``,!0):(openBlock(),createElementBlock(`div`,_hoisted_18$24,[createBaseVNode(`span`,{class:normalizeClass([`arrow`,{"green-price":computedTotalPriceDiff.value<0,"red-price":computedTotalPriceDiff.value>0}])},toDisplayString(computedTotalPriceDiff.value>0?`↑`:`↓`),3),createVNode(unref(bngUnit_default),{class:normalizeClass([`price-diff`,{"green-price":computedTotalPriceDiff.value<0,"red-price":computedTotalPriceDiff.value>0}]),money:computedTotalPriceDiff.value},null,8,[`class`,`money`])])),createVNode(unref(bngUnit_default),{money:newPremiumDetails.value?.totalPriceWithDriverScore||props.insuranceData.currentPremiumDetails.totalPriceWithDriverScore},null,8,[`money`])])])])]),createBaseVNode(`div`,_hoisted_19$21,[createVNode(unref(bngButton_default),{class:`cancel-button bigger-button`,accent:`custom`,onClick:closePopup},{default:withCtx(()=>[..._cache[6]||=[createTextVNode(` Cancel `,-1)]]),_:1}),createVNode(unref(bngButton_default),{class:`save-button bigger-button`,accent:`custom`,onClick:onSaveClick,disabled:!props.insuranceData.canPayPaperworkFees||!hasChangedCoverageOptions.value},{default:withCtx(()=>[props.insuranceData.canPayPaperworkFees?(openBlock(),createElementBlock(Fragment,{key:1},[_cache[7]||=createTextVNode(` Apply for `,-1),createVNode(unref(bngUnit_default),{money:props.insuranceData.paperworkFees},null,8,[`money`])],64)):(openBlock(),createElementBlock(Fragment,{key:0},[createTextVNode(` Insufficient funds `)],64))]),_:1},8,[`disabled`])])]))}},editPolicy_default=__plugin_vue_export_helper_default(_sfc_main$277,[[`__scopeId`,`data-v-081fecf3`]]),_sfc_main$276={__name:`insurancePerkIcon`,props:{perkIconData:{type:Object,required:!0}},setup(__props){let props=__props,computedColor=computed(()=>props.perkIconData.isSignaturePerk===void 0?props.perkIconData.color:props.perkIconData.isSignaturePerk?`green`:`blue`);return(_ctx,_cache)=>withDirectives((openBlock(),createElementBlock(`div`,{class:normalizeClass({"insurance-perk-icon":!__props.perkIconData.iconOnly,[computedColor.value]:computedColor.value})},[createVNode(unref(bngIcon_default),{type:unref(icons).shieldCheckmark,class:normalizeClass({"glowing-icon":!0,[computedColor.value]:computedColor.value})},null,8,[`type`,`class`]),__props.perkIconData.iconOnly?createCommentVNode(``,!0):(openBlock(),createElementBlock(`span`,{key:0,class:normalizeClass({"small-text":!0,[computedColor.value]:computedColor.value})},toDisplayString(__props.perkIconData.smallText),3))],2)),[[unref(BngTooltip_default),__props.perkIconData.iconOnly?null:__props.perkIconData.tooltipText,`top`]])}},insurancePerkIcon_default=__plugin_vue_export_helper_default(_sfc_main$276,[[`__scopeId`,`data-v-d2b025b6`]]),_hoisted_1$246={class:`insurance-perks-container`},_hoisted_2$203={class:`left`},_hoisted_3$178={class:`insurance-perk-icon-wrapper`},_hoisted_4$151={key:1},_hoisted_5$131={class:`insurance-perk-texts`},_hoisted_6$112={class:`insurance-perk-intro`},_hoisted_7$99={key:0,class:`insurance-perk-description`},_hoisted_8$83={key:0,class:`signature-perk-wrapper`},_sfc_main$275={__name:`insurancePerks`,props:{insuranceData:Object,noDescription:Boolean},setup(__props){let props=__props,sortedPerks=computed(()=>props.insuranceData.perks?[...Array.isArray(props.insuranceData.perks)?props.insuranceData.perks:Object.values(props.insuranceData.perks)].sort((a$1,b)=>Number(b.isSignaturePerk||!1)-Number(a$1.isSignaturePerk||!1)):[]);return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$246,[(openBlock(!0),createElementBlock(Fragment,null,renderList(sortedPerks.value,perk=>(openBlock(),createElementBlock(`div`,{key:perk.id,class:normalizeClass([`insurance-perk`,{highlighted:perk.isSignaturePerk,"no-insurance":__props.insuranceData.id===-1}])},[createBaseVNode(`div`,_hoisted_2$203,[createBaseVNode(`div`,_hoisted_3$178,[__props.insuranceData.id===-1?(openBlock(),createElementBlock(`span`,_hoisted_4$151,`-`)):(openBlock(),createBlock(insurancePerkIcon_default,{key:0,perkIconData:{iconOnly:!0,isSignaturePerk:perk.isSignaturePerk&&perk.isSignaturePerk||!1}},null,8,[`perkIconData`]))]),createBaseVNode(`div`,_hoisted_5$131,[createBaseVNode(`div`,_hoisted_6$112,toDisplayString(perk.intro),1),__props.noDescription?createCommentVNode(``,!0):(openBlock(),createElementBlock(`div`,_hoisted_7$99,toDisplayString(perk.description),1))])]),perk.isSignaturePerk?(openBlock(),createElementBlock(`div`,_hoisted_8$83,[..._cache[0]||=[createBaseVNode(`div`,{class:`signature-perk`},` SIGNATURE PERK `,-1)]])):createCommentVNode(``,!0)],2))),128))]))}},insurancePerks_default=__plugin_vue_export_helper_default(_sfc_main$275,[[`__scopeId`,`data-v-75e74910`]]),_hoisted_1$245={class:`insurance-perk-notice`},_sfc_main$274={__name:`insurancePerkNotice`,props:{perkText:{type:String,required:!0}},setup(__props){let props=__props;return(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$245,[createVNode(insurancePerkIcon_default,{perkIconData:{iconOnly:!0}}),createTextVNode(` `+toDisplayString(props.perkText),1)]))}},insurancePerkNotice_default=__plugin_vue_export_helper_default(_sfc_main$274,[[`__scopeId`,`data-v-a98b3238`]]),_hoisted_1$244={class:`popup-content`},_hoisted_2$202={class:`top-info`},_hoisted_3$177={class:`top-info-title`},_hoisted_4$150={class:`top-info-veh-name`},_hoisted_5$130={class:`top-info-value-and-insurance`},_hoisted_6$111={class:`section`},_hoisted_7$98={class:`section`},_hoisted_8$82={class:`contribution-wrapper`},_hoisted_9$73={class:`contribution-item-value`},_hoisted_10$63={key:0,class:`price-diff-container`},_hoisted_11$56={class:`contribution-item-value`},_hoisted_12$45={key:0,class:`price-diff-container`},_hoisted_13$38={class:`buttons`},_sfc_main$273={__name:`editVehicleCoverage`,props:{insuranceData:{type:Object,required:!0},vehicleData:{type:Object,required:!0}},emits:[`return`],setup(__props,{emit:__emit}){let props=__props,newPremiumPrice=ref(0),newInsurancePremiumDetails=ref({totalPriceWithDriverScore:0}),computedNewPremiumDiff=computed(()=>newPremiumPrice.value-props.vehicleData.insuranceData.currentPremiumPrice),computedNewInsurancePremiumDiff=computed(()=>newInsurancePremiumDetails.value.totalPriceWithDriverScore-props.insuranceData.currentPremiumDetails.totalPriceWithDriverScore),hasChangedCoverageOptions=computed(()=>props.vehicleData?.insuranceData?.coverageOptionsData?.currentCoverageOptionsSanitized?props.vehicleData.insuranceData.coverageOptionsData.currentCoverageOptionsSanitized.some(option=>changedCoverageOptions.value[option.key]!==option.currentValueId):!1),emit$1=__emit,closePopup=()=>{emit$1(`return`,!0)},changedCoverageOptions=ref({}),updatePremiumPrice=async()=>{newPremiumPrice.value=(await Lua_default.career_modules_insurance_insurance.calculateVehiclePremium(props.vehicleData.id,null,changedCoverageOptions.value)).cost,newInsurancePremiumDetails.value=await Lua_default.career_modules_insurance_insurance.calculateInsurancePremium(props.insuranceData.id,null,{[props.vehicleData.id]:changedCoverageOptions.value})},onChoiceClick=(coverageOption,choice)=>{changedCoverageOptions.value[coverageOption.key]=choice.id,updatePremiumPrice()},onToggleChange=(coverageOption,newValue)=>{let targetChoiceIndex=coverageOption.choices.findIndex(choice=>choice.value===newValue);targetChoiceIndex!==-1&&(changedCoverageOptions.value[coverageOption.key]=targetChoiceIndex+1),updatePremiumPrice()},onSaveClick=()=>{Lua_default.career_modules_insurance_insurance.saveNewVehicleCoverageOptions(props.vehicleData.id,changedCoverageOptions.value),emit$1(`return`,!0)},openSwitchProvider=()=>{addPopup(ChooseInsuranceMain_default,{menuMode:`change`,params:{vehicleId:props.vehicleData.id}})};return onMounted(()=>{props.vehicleData.insuranceData.coverageOptionsData.currentCoverageOptionsSanitized.forEach(option=>{changedCoverageOptions.value[option.key]=option.currentValueId}),updatePremiumPrice()}),(_ctx,_cache)=>(openBlock(),createElementBlock(`div`,_hoisted_1$244,[createBaseVNode(`div`,_hoisted_2$202,[createBaseVNode(`div`,_hoisted_3$177,[_cache[0]||=createTextVNode(` Select Deductible: `,-1),createBaseVNode(`span`,_hoisted_4$150,toDisplayString(props.vehicleData.name),1)]),createBaseVNode(`div`,_hoisted_5$130,[_cache[1]||=createTextVNode(` Value: `,-1),createVNode(unref(bngUnit_default),{money:props.vehicleData.initialValue},null,8,[`money`]),createTextVNode(` • Policy: `+toDisplayString(props.insuranceData.name),1)]),_cache[2]||=createBaseVNode(`div`,{class:`top-info-description`},` Choose how much you'll pay out-of-pocket when repairing this vehicle. Lower deductibles cost more per km. `,-1)]),createBaseVNode(`div`,_hoisted_6$111,[_cache[3]||=createBaseVNode(`div`,null,[createBaseVNode(`div`,{class:`header title`},` Choose Your Deductible `),createBaseVNode(`div`,{class:`under-title`},` You pay this amount per repair. `)],-1),createBaseVNode(`div`,null,[(openBlock(!0),createElementBlock(Fragment,null,renderList(props.vehicleData.insuranceData.coverageOptionsData.currentCoverageOptionsSanitized,coverageOption=>(openBlock(),createBlock(unref(coverageOption_default),{class:`coverage-option`,key:coverageOption.name,coverageOption,onlyShowMainText:!0,changedCoverageOptions:changedCoverageOptions.value,dontShowName:!0,onChoiceClick,onToggleChange},null,8,[`coverageOption`,`changedCoverageOptions`]))),128))])]),createBaseVNode(`div`,_hoisted_7$98,[_cache[6]||=createBaseVNode(`div`,{class:`title`},` Policy Impact `,-1),createBaseVNode(`div`,_hoisted_8$82,[createBaseVNode(`div`,{class:normalizeClass([`contribution-item`,{green:computedNewInsurancePremiumDiff.value<0,red:computedNewInsurancePremiumDiff.value>0}])},[_cache[4]||=createBaseVNode(`div`,{class:`contribution-item-title`},` Insurance Premium `,-1),createBaseVNode(`div`,_hoisted_9$73,[createVNode(unref(bngUnit_default),{money:props.insuranceData.currentPremiumDetails.totalPriceWithDriverScore},null,8,[`money`]),computedNewInsurancePremiumDiff.value!==0&&!isNaN(computedNewInsurancePremiumDiff.value)?(openBlock(),createElementBlock(`div`,_hoisted_10$63,` → `)):createCommentVNode(``,!0),computedNewInsurancePremiumDiff.value!==0&&!isNaN(computedNewInsurancePremiumDiff.value)?(openBlock(),createBlock(unref(bngUnit_default),{key:1,money:newInsurancePremiumDetails.value.totalPriceWithDriverScore},null,8,[`money`])):createCommentVNode(``,!0)])],2),createBaseVNode(`div`,{class:normalizeClass([`contribution-item`,{green:computedNewInsurancePremiumDiff.value<0,red:computedNewInsurancePremiumDiff.value>0}])},[_cache[5]||=createBaseVNode(`div`,{class:`contribution-item-title`},` Vehicle Contribution `,-1),createBaseVNode(`div`,_hoisted_11$56,[createVNode(unref(bngUnit_default),{money:props.vehicleData.insuranceData.currentPremiumPrice},null,8,[`money`]),computedNewPremiumDiff.value!==0&&!isNaN(computedNewPremiumDiff.value)?(openBlock(),createElementBlock(`div`,_hoisted_12$45,` → `)):createCommentVNode(``,!0),computedNewPremiumDiff.value!==0&&!isNaN(computedNewPremiumDiff.value)?(openBlock(),createBlock(unref(bngUnit_default),{key:1,money:newPremiumPrice.value},null,8,[`money`])):createCommentVNode(``,!0)])],2)])]),createBaseVNode(`div`,_hoisted_13$38,[createVNode(unref(bngButton_default),{class:`gray-button bigger-button`,accent:`custom`,onClick:closePopup},{default:withCtx(()=>[..._cache[7]||=[createTextVNode(` Cancel `,-1)]]),_:1}),createVNode(unref(bngButton_default),{class:`save-button bigger-button`,accent:`custom`,onClick:onSaveClick,disabled:!props.insuranceData.canPayPaperworkFees||!hasChangedCoverageOptions.value},{default:withCtx(()=>[props.insuranceData.canPayPaperworkFees?(openBlock(),createElementBlock(Fragment,{key:1},[_cache[8]||=createTextVNode(` Apply for `,-1),createVNode(unref(bngUnit_default),{money:props.insuranceData.paperworkFees},null,8,[`money`])],64)):(openBlock(),createElementBlock(Fragment,{key:0},[createTextVNode(` Insufficient funds `)],64))]),_:1},8,[`disabled`]),createVNode(unref(bngButton_default),{class:`gray-button bigger-button`,accent:`custom`,onClick:openSwitchProvider},{default:withCtx(()=>[..._cache[9]||=[createTextVNode(` Switch Provider `,-1)]]),_:1})])]))}},editVehicleCoverage_default=__plugin_vue_export_helper_default(_sfc_main$273,[[`__scopeId`,`data-v-9f014d2d`]]),_hoisted_1$243=[`innerHTML`],_hoisted_2$201={key:2,class:`insurance-icon`},_hoisted_3$176={class:`insurance-name`},_hoisted_4$149={key:3,class:`insurance-slogan`},_sfc_main$272={__name:`insuranceIdentity`,props:{insuranceData:{type:Object,required:!0}},setup(__props){let props=__props,hasInsurance=computed(()=>svgContent.value||props.insuranceData.image),hasNoInsurance=computed(()=>props.insuranceData?.id===-1),svgContent=ref(null);return watch(()=>props.insuranceData.image,async newPath=>{if(newPath&&newPath.endsWith(`.svg`))try{let rawSvg=await getFile(`/${newPath}`);rawSvg?svgContent.value=rawSvg.replace(/