return function(v0)
    local v1 = {
        callCount = 0,
        values = {},
        valuesLength = 0
    };
    v1.value = function(...)
        v1.callCount = v1.callCount + 1;
        v1.values = {
            ...
        };
        v1.valuesLength = select("#", ...);
        if v0 ~= nil then
            return v0(...);
        else
            return ;
        end;
    end;
    v1.assertCalledWith = function(_, ...)
        local v3 = select("#", ...);
        assert(v1.valuesLength, v3, "length of expected values differs from stored values");
        for v4 = 1, v3 do
            assert(v1.values[v4], select(v4, ...), "value differs");
        end;
    end;
    setmetatable(v1, {
        __index = function(_, v6)
            error(("%q is not a valid member of spy"):format(v6));
        end
    });
    return v1;
end;


return {
    createGroupMotor = require(script.createGroupMotor),
    createSingleMotor = require(script.createSingleMotor),
    spring = require(script.spring),
    instant = require(script.instant)
};


local function v3(v0, _, _)
    return {
        value = v0.__targetValue,
        complete = true
    };
end;
return function(v4)
    return {
        __targetValue = v4,
        step = v3
    };
end;


local v0 = require(script.Parent.assign);
local l_abs_0 = math.abs;
local l_exp_0 = math.exp;
local l_sin_0 = math.sin;
local l_cos_0 = math.cos;
local l_sqrt_0 = math.sqrt;
local function v36(v6, v7, v8)
    local l___dampingRatio_0 = v6.__dampingRatio;
    local v10 = (v6.__frequency * 2) * 3.141592653589793;
    local l___goalPosition_0 = v6.__goalPosition;
    local l___restingVelocityLimit_0 = v6.__restingVelocityLimit;
    local l___restingPositionLimit_0 = v6.__restingPositionLimit;
    local l_value_0 = v7.value;
    local v15 = v7.velocity or 0;
    local v16 = l_value_0 - l___goalPosition_0;
    local v17 = l_exp_0((-v8 * l___dampingRatio_0) * v10);
    local v18 = nil;
    local v19 = nil;
    if l___dampingRatio_0 == 1 then
        v18 = (v15 * v8 + v16 * (v10 * v8 + 1)) * v17 + l___goalPosition_0;
        v19 = (v15 - (v10 * v8) * (v16 * v10 + v15)) * v17;
    elseif l___dampingRatio_0 < 1 then
        local v20 = l_sqrt_0(1 - l___dampingRatio_0 * l___dampingRatio_0);
        local v21 = l_cos_0((v10 * v20) * v8);
        local v22 = l_sin_0((v10 * v20) * v8);
        local v23 = nil;
        if v20 > 1.0E-4 then
            v23 = v22 / v20;
        else
            local v24 = v8 * v10;
            v23 = v24 + (((((v24 * v24) * (v20 * v20)) * (v20 * v20)) / 20 - v20 * v20) * ((v24 * v24) * v24)) / 6;
        end;
        local v25 = nil;
        if v10 * v20 > 1.0E-4 then
            v25 = v22 / (v10 * v20);
        else
            local v26 = v10 * v20;
            v25 = v8 + (((((v8 * v8) * (v26 * v26)) * (v26 * v26)) / 20 - v26 * v26) * ((v8 * v8) * v8)) / 6;
        end;
        v18 = (v16 * (v21 + l___dampingRatio_0 * v23) + v15 * v25) * v17 + l___goalPosition_0;
        v19 = (v15 * (v21 - v23 * l___dampingRatio_0) - v16 * (v23 * v10)) * v17;
    else
        local v27 = l_sqrt_0(l___dampingRatio_0 * l___dampingRatio_0 - 1);
        local v28 = -v10 * (l___dampingRatio_0 - v27);
        local v29 = -v10 * (l___dampingRatio_0 + v27);
        local v30 = (v15 - v28 * v16) / ((2 * v10) * v27);
        local v31 = (v16 - v30) * l_exp_0(v28 * v8);
        local v32 = v30 * l_exp_0(v29 * v8);
        v18 = (v31 + v32) + l___goalPosition_0;
        v19 = v28 * v31 + v29 * v32;
    end;
    local v33 = l_abs_0(v18 - v6.__goalPosition);
    local v34 = l_abs_0(v19);
    local v35 = false;
    if v34 < l___restingVelocityLimit_0 then
        v35 = v33 < l___restingPositionLimit_0;
    end;
    if v35 then
        v18 = v6.__goalPosition;
        v19 = 0;
    end;
    return {
        value = v18,
        velocity = v19,
        complete = v35
    };
end;
return function(v37, v38)
    assert(typeof(v37) == "number");
    local v39 = {
        dampingRatio = 1,
        frequency = 1,
        restingVelocityLimit = 0.001,
        restingPositionLimit = 0.01
    };
    if v38 ~= nil then
        assert(typeof(v38) == "table");
        v0(v39, v38);
    end;
    local l_dampingRatio_0 = v39.dampingRatio;
    local l_frequency_0 = v39.frequency;
    local l_restingVelocityLimit_0 = v39.restingVelocityLimit;
    local l_restingPositionLimit_0 = v39.restingPositionLimit;
    assert(typeof(l_dampingRatio_0) == "number");
    assert(typeof(l_frequency_0) == "number");
    assert(typeof(l_restingVelocityLimit_0) == "number");
    assert(typeof(l_restingPositionLimit_0) == "number");
    assert(l_restingVelocityLimit_0 >= 0, "Expected restingVelocityLimit >= 0");
    assert(l_restingPositionLimit_0 >= 0, "Expected restingPositionLimit >= 0");
    return {
        __dampingRatio = l_dampingRatio_0,
        __frequency = l_frequency_0,
        __restingVelocityLimit = l_restingVelocityLimit_0,
        __restingPositionLimit = l_restingPositionLimit_0,
        __goalPosition = v37,
        step = v36
    };
end;


return function(v0)
    assert(typeof(v0) == "table");
    assert(typeof(v0.start) == "function");
    assert(typeof(v0.stop) == "function");
    assert(typeof(v0.step) == "function");
    assert(typeof(v0.setGoal) == "function");
    assert(typeof(v0.onStep) == "function");
    assert(typeof(v0.onComplete) == "function");
    assert(typeof(v0.destroy) == "function");
end;


local l_RunService_0 = game:GetService("RunService");
local v1 = {};
local v8 = {
    Connect = function(_, v3)
        v1[v3] = true;
        return {
            Disconnect = function()
                v1[v3] = nil;
            end
        };
    end,
    Fire = function(_, v5)
        for v6, _ in v1, nil, nil do
            v6(v5);
        end;
    end
};
return {
    Connect = function(_, v10)
        if not _G.__OTTER_MOCK_HEARTBEAT__ then
            return l_RunService_0.Heartbeat:Connect(v10);
        else
            return v8:Connect(v10);
        end;
    end,
    Fire = function(_, v12)
        if not _G.__OTTER_MOCK_HEARTBEAT__ then
            error("Cannot manually fire real Heartbeat");
            return ;
        else
            v8:Fire(v12 or 0.016666666666666666);
            return ;
        end;
    end
};


local l_Parent_0 = script.Parent.Parent;
local l_Object_0 = require(l_Parent_0.Collections).Object;
local l_createSignal_0 = require(l_Parent_0.Signal).createSignal;
local v3 = require(script.Parent.Heartbeat);
local _ = require(script.Parent.types);
local v5 = {};
v5.__index = v5;
local function v15(v6)
    local v7 = {};
    for v8, v9 in pairs(v6) do
        v7[v8] = {
            value = v9,
            complete = true
        };
    end;
    local v10, v11 = l_createSignal_0();
    local v12, v13 = l_createSignal_0();
    local v14 = {
        __goals = {},
        __states = v7,
        __allComplete = true,
        __onComplete = v10,
        __fireOnComplete = v11,
        __onStep = v12,
        __fireOnStep = v13,
        __running = false
    };
    setmetatable(v14, v5);
    return v14;
end;
v5.start = function(v16)
    if not v16.__running then
        v16.__connection = v3:Connect(function(v17)
            v16:step(v17);
        end);
        v16.__running = true;
        return ;
    else
        return ;
    end;
end;
v5.stop = function(v18)
    if v18.__connection ~= nil then
        v18.__connection:Disconnect();
        v18.__running = false;
    end;
end;
v5.step = function(v19, v20)
    if not v19.__allComplete then
        local v21 = true;
        local v22 = {};
        for v23, v24 in pairs(v19.__states) do
            if not v24.complete then
                local v25 = v19.__goals[v23];
                if v25 ~= nil then
                    local v26 = v25.step(v24, v20);
                    if v26 ~= nil then
                        v24 = v26;
                        v19.__states[v23] = v26;
                    end;
                else
                    v24.complete = true;
                end;
                if not v24.complete then
                    v21 = false;
                end;
            end;
            v22[v23] = v24.value;
        end;
        local l___allComplete_0 = v19.__allComplete;
        v19.__allComplete = v21;
        v19.__fireOnStep(v22);
        if not ((not v19.__allComplete or l___allComplete_0) or not v19.__running) then
            v19:stop();
            v19.__fireOnComplete(v22);
        end;
        return ;
    else
        return ;
    end;
end;
v5.setGoal = function(v28, v29)
    v28.__goals = l_Object_0.assign({}, v28.__goals, v29);
    for v30 in pairs(v29) do
        local v31 = v28.__states[v30];
        if v31 == nil then
            error(("Cannot set goal for the value %s because it doesn't exist"):format((tostring(v30))), 2);
        end;
        v31.complete = false;
    end;
    v28.__allComplete = false;
    v28:start();
end;
v5.onStep = function(v32, v33)
    local v34 = v32.__onStep:subscribe(v33);
    return function()
        v34:unsubscribe();
    end;
end;
v5.onComplete = function(v35, v36)
    local v37 = v35.__onComplete:subscribe(v36);
    return function()
        v37:unsubscribe();
    end;
end;
v5.destroy = function(v38)
    v38:stop();
end;
return v15;


local l_createSignal_0 = require(script.Parent.Parent.Signal).createSignal;
local v1 = require(script.Parent.Heartbeat);
local _ = require(script.Parent.types);
local v3 = {};
v3.__index = v3;
local function v10(v4)
    local v5, v6 = l_createSignal_0();
    local v7, v8 = l_createSignal_0();
    local v9 = {
        __goal = nil,
        __state = {
            value = v4,
            complete = true
        },
        __onComplete = v5,
        __fireOnComplete = v6,
        __onStep = v7,
        __fireOnStep = v8,
        __running = false
    };
    setmetatable(v9, v3);
    return v9;
end;
v3.start = function(v11)
    if not v11.__running then
        v11.__connection = v1:Connect(function(v12)
            v11:step(v12);
        end);
        v11.__running = true;
        return ;
    else
        return ;
    end;
end;
v3.stop = function(v13)
    if v13.__connection ~= nil then
        v13.__connection:Disconnect();
    end;
    v13.__running = false;
end;
v3.step = function(v14, v15)
    if not v14.__state.complete then
        if v14.__goal == nil then
            return ;
        else
            local v16 = v14.__goal.step(v14.__state, v15);
            if v16 ~= nil then
                v14.__state = v16;
            end;
            v14.__fireOnStep(v14.__state.value);
            if not (not v14.__state.complete or not v14.__running) then
                v14:stop();
                v14.__fireOnComplete(v14.__state.value);
            end;
            return ;
        end;
    else
        return ;
    end;
end;
v3.setGoal = function(v17, v18)
    v17.__goal = v18;
    v17.__state.complete = false;
    v17:start();
end;
v3.onStep = function(v19, v20)
    local v21 = v19.__onStep:subscribe(v20);
    return function()
        v21:unsubscribe();
    end;
end;
v3.onComplete = function(v22, v23)
    local v24 = v22.__onComplete:subscribe(v23);
    return function()
        v24:unsubscribe();
    end;
end;
v3.destroy = function(v25)
    v25:stop();
end;
return v10;


local v0 = require(script.createGroupMotor);
local v1 = require(script.createSingleMotor);
local v2 = require(script.spring);
local v3 = require(script.instant);
local _ = require(script.types);
return {
    createGroupMotor = v0,
    createSingleMotor = v1,
    spring = v2,
    instant = v3,
    __devHeartbeat = require(script.Heartbeat)
};


local _ = require(script.Parent.types);
return function(v1)
    return {
        step = function()
            return {
                value = v1,
                complete = true
            };
        end
    };
end;


local l_assign_0 = require(script.Parent.Parent.Collections).Object.assign;
local _ = require(script.Parent.types);
local l_abs_0 = math.abs;
local l_exp_0 = math.exp;
local l_sin_0 = math.sin;
local l_cos_0 = math.cos;
local l_sqrt_0 = math.sqrt;
local function _(v7, v8, v9)
    return v7 / (2 * l_sqrt_0(v9 * v8)), (l_sqrt_0(v8 / v9) / 2) / 3.141592653589793;
end;
return function(v11, v12)
    local v13 = {
        dampingRatio = 1,
        frequency = 1,
        restingVelocityLimit = 0.001,
        restingPositionLimit = 0.01
    };
    if v12 ~= nil then
        l_assign_0(v13, v12);
    end;
    local v14 = nil;
    local v15 = nil;
    local l_restingVelocityLimit_0 = v13.restingVelocityLimit;
    local l_restingPositionLimit_0 = v13.restingPositionLimit;
    local l_damping_0 = v13.damping;
    local l_stiffness_0 = v13.stiffness;
    local l_mass_0 = v13.mass;
    if (typeof(l_damping_0) == "number" and typeof(l_stiffness_0) == "number") and typeof(l_mass_0) == "number" then
        local v21 = l_damping_0 / (2 * l_sqrt_0(l_mass_0 * l_stiffness_0));
        local v22 = (l_sqrt_0(l_stiffness_0 / l_mass_0) / 2) / 3.141592653589793;
        local l_v21_0 = v21;
        local l_v22_0 = v22;
        v14 = l_v21_0;
        v15 = l_v22_0;
    else
        v14 = v13.dampingRatio;
        v15 = v13.frequency;
    end;
    local l_v14_0 = v14;
    local v26 = (v15 * 2) * 3.141592653589793;
    assert(l_restingVelocityLimit_0 >= 0, "Expected restingVelocityLimit >= 0");
    assert(l_restingPositionLimit_0 >= 0, "Expected restingPositionLimit >= 0");
    return {
        step = function(v27, v28)
            local l_value_0 = v27.value;
            local v30 = v27.velocity or 0;
            local v31 = l_value_0 - v11;
            local v32 = l_exp_0((-v28 * l_v14_0) * v26);
            local v33 = nil;
            local v34 = nil;
            if l_v14_0 == 1 then
                v33 = (v30 * v28 + v31 * (v26 * v28 + 1)) * v32 + v11;
                v34 = (v30 - (v26 * v28) * (v31 * v26 + v30)) * v32;
            elseif l_v14_0 < 1 then
                local v35 = l_sqrt_0(1 - l_v14_0 * l_v14_0);
                local v36 = l_cos_0((v26 * v35) * v28);
                local v37 = l_sin_0((v26 * v35) * v28);
                local v38 = nil;
                if v35 > 1.0E-4 then
                    v38 = v37 / v35;
                else
                    local v39 = v28 * v26;
                    v38 = v39 + (((((v39 * v39) * (v35 * v35)) * (v35 * v35)) / 20 - v35 * v35) * ((v39 * v39) * v39)) / 6;
                end;
                local v40 = nil;
                if v26 * v35 > 1.0E-4 then
                    v40 = v37 / (v26 * v35);
                else
                    local v41 = v26 * v35;
                    v40 = v28 + (((((v28 * v28) * (v41 * v41)) * (v41 * v41)) / 20 - v41 * v41) * ((v28 * v28) * v28)) / 6;
                end;
                v33 = (v31 * (v36 + l_v14_0 * v38) + v30 * v40) * v32 + v11;
                v34 = (v30 * (v36 - v38 * l_v14_0) - v31 * (v38 * v26)) * v32;
            else
                local v42 = l_sqrt_0(l_v14_0 * l_v14_0 - 1);
                local v43 = -v26 * (l_v14_0 - v42);
                local v44 = -v26 * (l_v14_0 + v42);
                local v45 = (v30 - v43 * v31) / ((2 * v26) * v42);
                local v46 = (v31 - v45) * l_exp_0(v43 * v28);
                local v47 = v45 * l_exp_0(v44 * v28);
                v33 = (v46 + v47) + v11;
                v34 = v43 * v46 + v44 * v47;
            end;
            local v48 = l_abs_0(v33 - v11);
            local v49 = l_abs_0(v34);
            local v50 = false;
            if v49 < l_restingVelocityLimit_0 then
                v50 = v48 < l_restingPositionLimit_0;
            end;
            if v50 then
                v33 = v11;
                v34 = 0;
            end;
            return {
                value = v33,
                velocity = v34,
                complete = v50
            };
        end
    };
end;


local l_Path_0 = require(script.path).Path;
makePathImpl = function()
    local v1 = l_Path_0.new();
    v1:initialize("/", "/");
    return v1;
end;
return {
    path = makePathImpl(),
    Path = l_Path_0
};


local _ = require(script.Parent.Parent.LuauPolyfill);
local v1 = {
    env = {},
    cwd = function()
        return "";
    end
};
local v2 = {};
v2.__index = v2;
v2.new = function()
    return (setmetatable({}, v2));
end;
v2.initialize = function(v3, v4, v5)
    v3.root = v4;
    v3.sep = v5;
end;
v2.getRoot = function(v6)
    return v6.root;
end;
v2.getSep = function(v7)
    return v7.sep;
end;
v2.pathsEqual = function(_, v9, v10)
    return v9 == v10;
end;
v2._splitPath = function(v11, v12)
    v12 = v11:normalizeSeparators(v12);
    local v13 = "";
    if not (not v11:isAbsolute(v12) and not v11:isDriveRelative(v12)) then
        v13 = v11:getRoot(v12);
        v12 = v12:sub(v13:len() + 1);
    end;
    local v14 = v12:match("[" .. v11.sep .. "]*$");
    if v14 then
        v12 = v12:sub(1, -v14:len() - 1);
    end;
    local v15 = v12:match("[^" .. v11.sep .. "]+$") or "";
    return v13, not not v15 and v12:sub(1, -v15:len() - 1) or v12, v15;
end;
v2._normalizeArray = function(_, v17, v18)
    local v19 = 0;
    for v20 = #v17, 1, -1 do
        local v21 = v17[v20];
        if v21 == "." then
            table.remove(v17, v20);
        elseif v21 == ".." then
            table.remove(v17, v20);
            v19 = v19 + 1;
        elseif v19 > 0 then
            table.remove(v17, v20);
            v19 = v19 - 1;
        end;
    end;
    if v18 then
        while v19 > 0 do
            table.insert(v17, 1, "..");
            v19 = v19 - 1;
        end;
    end;
end;
v2._splitBySeparators = function(v22, v23)
    local v24 = {};
    for v25 in v23:gmatch("[^" .. v22.sep .. "]+") do
        v24[#v24 + 1] = v25;
    end;
    return v24;
end;
v2.normalize = function(v26, v27)
    v27 = v26:normalizeSeparators(v27);
    local v28 = v26:isAbsolute(v27);
    local v29 = not not v28 and v26:getRoot(v27) or nil;
    local v30 = v27:sub(#v27) == v26.sep;
    if v29 then
        v27 = v27:sub(v29:len() + 1);
    end;
    local v31 = v26:_splitBySeparators(v27);
    v26:_normalizeArray(v31, not v28);
    v27 = table.concat(v31, v26.sep);
    if #v27 == 0 then
        if not v28 then
            return ".";
        else
            return v29;
        end;
    else
        if v30 then
            v27 = v27 .. v26.sep;
        end;
        if v28 then
            v27 = v29 .. v27;
        end;
        return v27;
    end;
end;
v2._filterparts = function(v32, v33)
    local v34 = {};
    for _, v36 in ipairs(v33) do
        if v36 and v36 ~= "" then
            table.insert(v34, v36);
        end;
    end;
    for v37, v38 in ipairs(v34) do
        if v37 > 1 then
            while v38:sub(1, 1) == v32.sep do
                v38 = v38:sub(2);
            end;
        end;
        if v37 < #v34 then
            while v38:sub(#v38) == v32.sep do
                v38 = v38:sub(1, #v38 - 1);
            end;
        end;
        v34[v37] = v38;
    end;
    return v34;
end;
v2._rawjoin = function(v39, v40)
    return table.concat(v40, v39.sep);
end;
v2._filteredjoin = function(v41, ...)
    local v42 = {
        ...
    };
    for v43, v44 in ipairs(v42) do
        v42[v43] = v41:normalizeSeparators(v44);
    end;
    local v45 = v41:_filterparts(v42);
    return v41:_rawjoin(v45), v45;
end;
v2.join = function(v46, ...)
    return v46:normalize((v46:_filteredjoin(...)));
end;
v2.resolve = function(v47, ...)
    local v48 = {
        ...
    };
    local v49 = "";
    local v50 = nil;
    local v51 = false;
    for v52 = #v48, 1, -1 do
        local v53 = v48[v52];
        if v53 and v53 ~= "" then
            local v54 = v50 and v47:getRoot(v53);
            if v47:isDriveRelative(v53) then
                v54 = v54 or v47:getRoot(v53);
                v50 = v50 or v54;
                v53 = v53:sub(v54:len() + 1);
            end;
            if not v54 or v50:sub(1, 2) == v54:sub(1, 2) then
                v49 = v47:join(v47:normalize(v53), v49);
                if v47:isAbsolute(v49) then
                    v51 = true;
                    break;
                end;
            end;
        end;
    end;
    if not v51 then
        if not v50 then
            v49 = v47:join(v1.cwd(), v49);
        else
            local v55 = v1.env["=" .. v50];
            v49 = if not not v55 and v47:pathsEqual(v55:sub(1, 2), v50) then v47:join(v55, v49) else v47:join(v50, v49);
        end;
    end;
    local v56 = v49:match("[" .. v47.sep .. "]*$");
    if v56 then
        v49 = v49:sub(1, -v56:len() - 1);
    end;
    return v49;
end;
v2._commonParts = function(v57, ...)
    local v58 = {};
    local v59 = {
        ...
    };
    local v60 = {};
    for _, v62 in ipairs(v59) do
        table.insert(v60, v57:_splitBySeparators(v62));
    end;
    for v63 = 1, #v60[1] do
        local v64 = v60[1][v63];
        for v65 = 2, #v60 do
            if not v57:pathsEqual(v64, v60[v65][v63]) then
                return v58;
            end;
        end;
        table.insert(v58, v64);
    end;
    return v58;
end;
v2.relative = function(v66, v67, v68)
    local v69, v70, v71 = v66:_splitPath(v67);
    local v72, v73, v74 = v66:_splitPath(v68);
    if v66:pathsEqual(v69, v72) then
        local v75 = v70 .. v71;
        local v76 = v73 .. v74;
        local v77 = v66:_commonParts(v75, v76);
        local v78 = v66:_splitBySeparators(v75);
        local v79 = v66:_splitBySeparators(v76);
        local v80 = {};
        if #v77 > 0 then
            for _ = #v77, #v78 - 1 do
                table.insert(v80, "..");
            end;
        end;
        for v82 = #v77 + 1, #v79 do
            table.insert(v80, v79[v82]);
        end;
        return v66:_rawjoin(v80);
    else
        return v68;
    end;
end;
v2.dirname = function(v83, v84)
    v84 = v83:normalizeSeparators(v84);
    if v84:sub(v84:len()) == v83.sep then
        v84 = v84:sub(1, -2);
    end;
    local v85, v86 = v83:_splitPath(v84);
    if #v86 > 0 then
        return v85 .. v86:sub(1, #v86 - 1);
    elseif #v85 > 0 then
        return v85;
    else
        return ".";
    end;
end;
v2.basename = function(v87, v88, v89)
    local _, _, v92 = v87:_splitPath(v88);
    if v89 then
        local v93 = v92:find(v89:gsub(".", ".") .. "$");
        if v93 then
            v92 = v92:sub(1, v93 - 1);
        end;
    end;
    return v92;
end;
v2.extname = function(v94, v95)
    local v96 = v94:basename(v95);
    if v96 == ".." then
        return "";
    else
        return v96:match(".(%.[^.]*)$") or "";
    end;
end;
v2.isDriveRelative = function(_)
    return false;
end;
v2.isAbsolute = function(v98, v99)
    return v99:sub(1, v98.root:len()) == v98.root;
end;
v2.normalizeSeparators = function(_, v101)
    return v101;
end;
return {
    Path = v2
};


local _ = require(script.Parent.Parent.LuauPolyfill);
local v1 = {
    env = {},
    cwd = function()
        return "";
    end
};
local v2 = {};
v2.__index = v2;
v2.new = function()
    return (setmetatable({}, v2));
end;
v2.initialize = function(v3, v4, v5)
    v3.root = v4;
    v3.sep = v5;
end;
v2.getRoot = function(v6, _)
    return v6.root;
end;
v2.getSep = function(v8)
    return v8.sep;
end;
v2.pathsEqual = function(_, v10, v11)
    return v10 == v11;
end;
v2._splitPath = function(v12, v13)
    v13 = v12:normalizeSeparators(v13);
    local v14 = "";
    if not (not v12:isAbsolute(v13) and not v12:isDriveRelative(v13)) then
        v14 = v12:getRoot(v13);
        v13 = v13:sub(v14:len() + 1);
    end;
    local v15 = v13:match("[" .. v12.sep .. "]*$");
    if v15 then
        v13 = v13:sub(1, -v15:len() - 1);
    end;
    local v16 = v13:match("[^" .. v12.sep .. "]+$") or "";
    return v14, not not v16 and v13:sub(1, -v16:len() - 1) or v13, v16;
end;
v2._normalizeArray = function(_, v18, v19)
    local v20 = 0;
    for v21 = #v18, 1, -1 do
        local v22 = v18[v21];
        if v22 == "." then
            table.remove(v18, v21);
        elseif v22 == ".." then
            table.remove(v18, v21);
            v20 = v20 + 1;
        elseif v20 > 0 then
            table.remove(v18, v21);
            v20 = v20 - 1;
        end;
    end;
    if v19 then
        while v20 > 0 do
            table.insert(v18, 1, "..");
            v20 = v20 - 1;
        end;
    end;
end;
v2._splitBySeparators = function(v23, v24)
    local v25 = {};
    for v26 in v24:gmatch("[^" .. v23.sep .. "]+") do
        v25[#v25 + 1] = v26;
    end;
    return v25;
end;
v2.normalize = function(v27, v28)
    v28 = v27:normalizeSeparators(v28);
    local v29 = v27:isAbsolute(v28);
    local v30 = not not v29 and v27:getRoot(v28) or nil;
    local v31 = v28:sub(#v28) == v27.sep;
    if v30 then
        v28 = v28:sub(v30:len() + 1);
    end;
    local v32 = v27:_splitBySeparators(v28);
    v27:_normalizeArray(v32, not v29);
    v28 = table.concat(v32, v27.sep);
    if #v28 == 0 then
        if not v29 then
            return ".";
        else
            return v30;
        end;
    else
        if v31 then
            v28 = v28 .. v27.sep;
        end;
        if v29 then
            v28 = v30 .. v28;
        end;
        return v28;
    end;
end;
v2._filterparts = function(v33, v34)
    local v35 = {};
    for _, v37 in ipairs(v34) do
        if v37 and v37 ~= "" then
            table.insert(v35, v37);
        end;
    end;
    for v38, v39 in ipairs(v35) do
        if v38 > 1 then
            while v39:sub(1, 1) == v33.sep do
                v39 = v39:sub(2);
            end;
        end;
        if v38 < #v35 then
            while v39:sub(#v39) == v33.sep do
                v39 = v39:sub(1, #v39 - 1);
            end;
        end;
        v35[v38] = v39;
    end;
    return v35;
end;
v2._rawjoin = function(v40, v41)
    return table.concat(v41, v40.sep);
end;
v2._filteredjoin = function(v42, ...)
    local v43 = {
        ...
    };
    for v44, v45 in ipairs(v43) do
        v43[v44] = v42:normalizeSeparators(v45);
    end;
    local v46 = v42:_filterparts(v43);
    return v42:_rawjoin(v46), v46;
end;
v2.join = function(v47, ...)
    return v47:normalize((v47:_filteredjoin(...)));
end;
v2.resolve = function(v48, ...)
    local v49 = {
        ...
    };
    local v50 = "";
    local v51 = nil;
    local v52 = false;
    for v53 = #v49, 1, -1 do
        local v54 = v49[v53];
        if v54 and v54 ~= "" then
            local v55 = v51 and v48:getRoot(v54);
            if v48:isDriveRelative(v54) then
                v55 = v55 or v48:getRoot(v54);
                v51 = v51 or v55;
                v54 = v54:sub(v55:len() + 1);
            end;
            if not v55 or v51:sub(1, 2) == v55:sub(1, 2) then
                v50 = v48:join(v48:normalize(v54), v50);
                if v48:isAbsolute(v50) then
                    v52 = true;
                    break;
                end;
            end;
        end;
    end;
    if not v52 then
        if not v51 then
            v50 = v48:join(v1.cwd(), v50);
        else
            local v56 = v1.env["=" .. v51];
            v50 = if not not v56 and v48:pathsEqual(v56:sub(1, 2), v51) then v48:join(v56, v50) else v48:join(v51, v50);
        end;
    end;
    local v57 = v50:match("[" .. v48.sep .. "]*$");
    if v57 then
        v50 = v50:sub(1, -v57:len() - 1);
    end;
    return v50;
end;
v2._commonParts = function(v58, ...)
    local v59 = {};
    local v60 = {
        ...
    };
    local v61 = {};
    for _, v63 in ipairs(v60) do
        table.insert(v61, v58:_splitBySeparators(v63));
    end;
    for v64 = 1, #v61[1] do
        local v65 = v61[1][v64];
        for v66 = 2, #v61 do
            if not v58:pathsEqual(v65, v61[v66][v64]) then
                return v59;
            end;
        end;
        table.insert(v59, v65);
    end;
    return v59;
end;
v2.relative = function(v67, v68, v69)
    local v70, v71, v72 = v67:_splitPath(v68);
    local v73, v74, v75 = v67:_splitPath(v69);
    if v67:pathsEqual(v70, v73) then
        local v76 = v71 .. v72;
        local v77 = v74 .. v75;
        local v78 = v67:_commonParts(v76, v77);
        local v79 = v67:_splitBySeparators(v76);
        local v80 = v67:_splitBySeparators(v77);
        local v81 = {};
        if #v78 > 0 then
            for _ = #v78, #v79 - 1 do
                table.insert(v81, "..");
            end;
        end;
        for v83 = #v78 + 1, #v80 do
            table.insert(v81, v80[v83]);
        end;
        return v67:_rawjoin(v81);
    else
        return v69;
    end;
end;
v2.dirname = function(v84, v85)
    v85 = v84:normalizeSeparators(v85);
    if v85:sub(v85:len()) == v84.sep then
        v85 = v85:sub(1, -2);
    end;
    local v86, v87 = v84:_splitPath(v85);
    if #v87 > 0 then
        return v86 .. v87:sub(1, #v87 - 1);
    elseif #v86 > 0 then
        return v86;
    else
        return ".";
    end;
end;
v2.basename = function(v88, v89, v90)
    local _, _, v93 = v88:_splitPath(v89);
    if v90 then
        local v94 = v93:find(v90:gsub(".", ".") .. "$");
        if v94 then
            v93 = v93:sub(1, v94 - 1);
        end;
    end;
    return v93;
end;
v2.extname = function(v95, v96)
    local v97 = v95:basename(v96);
    if v97 == ".." then
        return "";
    else
        return v97:match(".(%.[^.]*)$") or "";
    end;
end;
v2.isDriveRelative = function(_)
    return false;
end;
v2.isAbsolute = function(v99, v100)
    return v100:sub(1, v99.root:len()) == v99.root;
end;
v2.normalizeSeparators = function(_, v102)
    return v102;
end;
return {
    Path = v2
};


local l_Parent_0 = script.Parent;
local l_Parent_1 = l_Parent_0.Parent;
local v2 = require(l_Parent_1.LuauPolyfill);
local l_Array_0 = v2.Array;
local l_Boolean_0 = v2.Boolean;
local l_Error_0 = v2.Error;
local l_Object_0 = v2.Object;
local l_String_0 = v2.String;
local l_stringReplace_0 = require(l_Parent_0.stringUtils).stringReplace;
local v9 = require(l_Parent_1.RegExp);
local v10 = require(l_Parent_0.constants);
local v11 = require(l_Parent_0.utils);
local l_MAX_LENGTH_0 = v10.MAX_LENGTH;
local l_POSIX_REGEX_SOURCE_0 = v10.POSIX_REGEX_SOURCE;
local l_REGEX_NON_SPECIAL_CHARS_0 = v10.REGEX_NON_SPECIAL_CHARS;
local l_REGEX_SPECIAL_CHARS_BACKREF_0 = v10.REGEX_SPECIAL_CHARS_BACKREF;
local l_REPLACEMENTS_0 = v10.REPLACEMENTS;
local function v21(v17, v18)
    if typeof(v18.expandRange) == "function" then
        return v18.expandRange(table.unpack(v17), v18);
    else
        l_Array_0.sort(v17);
        local v19 = ("[%s]"):format(l_Array_0.join(v17, "-"));
        if pcall(function()
            v9(v19);
        end) then
            return v19;
        else
            return l_Array_0.join(l_Array_0.map(v17, function(v20)
                return v11.escapeRegex(v20);
            end), "..");
        end;
    end;
end;
local function _(v22, v23)
    return ("Missing %s: \"%s\" - use \"\\%s\" to match literal characters"):format(v22, v23, v23);
end;
local v25 = nil;
local v29 = setmetatable({}, {
    __call = function(_, v27, v28)
        return v25(v27, v28);
    end
});
v25 = function(v30, v31)
    if typeof(v30) ~= "string" then
        error(l_Error_0.new("TypeError: Expected a string"));
    end;
    v30 = l_REPLACEMENTS_0[v30] or v30;
    local v32 = l_Object_0.assign({}, v31);
    local v33 = if typeof(v32.maxLength) == "number" then math.min(l_MAX_LENGTH_0, v32.maxLength) else l_MAX_LENGTH_0;
    local v34 = #v30;
    if v33 < v34 then
        error(l_Error_0.new(("SyntaxError: Input length: %s, exceeds maximum allowed length: %s"):format(tostring(v34), (tostring(v33)))));
    end;
    local v35 = {
        type = "bos",
        value = "",
        output = v32.prepend or ""
    };
    local v36 = {
        v35
    };
    local v37 = not l_Boolean_0.toJSBoolean(v32.capture) and "?:" or "";
    local v38 = v10.globChars((v11.isWindows(v31)));
    local v39 = v10.extglobChars(v38);
    local l_DOT_LITERAL_0 = v38.DOT_LITERAL;
    local l_PLUS_LITERAL_0 = v38.PLUS_LITERAL;
    local l_SLASH_LITERAL_0 = v38.SLASH_LITERAL;
    local l_ONE_CHAR_0 = v38.ONE_CHAR;
    local l_DOTS_SLASH_0 = v38.DOTS_SLASH;
    local l_NO_DOT_0 = v38.NO_DOT;
    local l_NO_DOT_SLASH_0 = v38.NO_DOT_SLASH;
    local l_NO_DOTS_SLASH_0 = v38.NO_DOTS_SLASH;
    local l_QMARK_0 = v38.QMARK;
    local l_QMARK_NO_DOT_0 = v38.QMARK_NO_DOT;
    local l_STAR_0 = v38.STAR;
    local l_START_ANCHOR_0 = v38.START_ANCHOR;
    local function _(v52)
        return ("(%s(?:(?format(v37, l_START_ANCHOR_0, if not l_Boolean_0.toJSBoolean(v52.dot) then l_DOT_LITERAL_0 else l_DOTS_SLASH_0);
    end;
    local v54 = if not l_Boolean_0.toJSBoolean(v32.dot) then l_NO_DOT_0 else "";
    local v55 = if not l_Boolean_0.toJSBoolean(v32.dot) then l_QMARK_NO_DOT_0 else l_QMARK_0;
    local v56 = if v32.bash == true then ("(%s(?:(?format(v37, l_START_ANCHOR_0, if not l_Boolean_0.toJSBoolean(v32.dot) then l_DOT_LITERAL_0 else l_DOTS_SLASH_0) else l_STAR_0;
    if l_Boolean_0.toJSBoolean(v32.capture) then
        v56 = ("(%s)"):format(v56);
    end;
    if typeof(v32.noext) == "boolean" then
        v32.noextglob = v32.noext;
    end;
    local v57 = {
        input = v30,
        index = 0,
        start = 1,
        dot = v32.dot == true,
        consumed = "",
        output = "",
        prefix = "",
        backtrack = false,
        negated = false,
        brackets = 0,
        braces = 0,
        parens = 0,
        quotes = 0,
        globstar = false,
        tokens = v36
    };
    v30 = v11.removePrefix(v30, v57);
    v34 = #v30;
    local v58 = {};
    local v59 = {};
    local v60 = {};
    local l_v35_0 = v35;
    local v62 = nil;
    local function _()
        return v57.index == v34;
    end;
    v57.peek = function(v64)
        local v65 = if v64 ~= nil then v64 else 1;
        return (string.sub(v30, v57.index + v65, v57.index + v65));
    end;
    local l_peek_0 = v57.peek;
    v57.advance = function()
        local l_v57_0 = v57;
        l_v57_0.index = l_v57_0.index + 1;
        return string.sub(v30, v57.index, v57.index) or "";
    end;
    local l_advance_0 = v57.advance;
    local function _()
        return (string.sub(v30, v57.index + 1));
    end;
    local function _(v70, v71)
        local v72 = v70 or "";
        local v73 = v71 or 0;
        local l_v57_1 = v57;
        l_v57_1.consumed = l_v57_1.consumed .. v72;
        l_v57_1 = v57;
        l_v57_1.index = l_v57_1.index + v73;
    end;
    local function _(v76)
        local l_v57_2 = v57;
        l_v57_2.output = l_v57_2.output .. if v76.output ~= nil then v76.output else v76.value;
        local v78 = v76.value or "";
        local l_v57_3 = v57;
        l_v57_3.consumed = l_v57_3.consumed .. v78;
        l_v57_3 = v57;
        l_v57_3.index = l_v57_3.index + 0;
    end;
    local function v84()
        local v81 = 1;
        while l_peek_0() == "" and (not (l_peek_0(2) == "(") or l_peek_0(3) == "?") do
            l_advance_0();
            local l_v57_4 = v57;
            l_v57_4.start = l_v57_4.start + 1;
            v81 = v81 + 1;
        end;
        if v81 % 2 == 0 then
            return false;
        else
            v57.negated = true;
            local l_v57_5 = v57;
            l_v57_5.start = l_v57_5.start + 1;
            return true;
        end;
    end;
    local function _(v85)
        local l_v57_6 = v57;
        l_v57_6[v85] = l_v57_6[v85] + 1;
        table.insert(v60, v85);
    end;
    local function _(v88)
        local l_v57_7 = v57;
        l_v57_7[v88] = l_v57_7[v88] - 1;
        table.remove(v60);
    end;
    local function v100(v91)
        if l_v35_0.type == "globstar" then
            local v92 = false;
            if v57.braces > 0 then
                v92 = true;
                if v91.type ~= "comma" then
                    v92 = v91.type == "brace";
                end;
            end;
            local v93 = true;
            if v91.extglob ~= true then
                if #v58 ~= 0 then
                    v93 = true;
                    if v91.type ~= "pipe" then
                        v93 = v91.type == "paren";
                    end;
                else
                    v93 = #v58;
                end;
            end;
            if not ((not (v91.type ~= "slash" and v91.type ~= "paren") or v92) or v93) then
                v57.output = l_String_0.slice(v57.output, 0, -#l_v35_0.output);
                l_v35_0.type = "star";
                l_v35_0.value = "*";
                l_v35_0.output = v56;
                local l_v57_8 = v57;
                l_v57_8.output = l_v57_8.output .. l_v35_0.output;
            end;
        end;
        if #v58 ~= 0 and v91.type ~= "paren" then
            local v95 = v58[#v58];
            v95.inner = v95.inner .. v91.value;
        end;
        if not (not l_Boolean_0.toJSBoolean(v91.value) and not l_Boolean_0.toJSBoolean(v91.output)) then
            local l_v57_9 = v57;
            l_v57_9.output = l_v57_9.output .. if v91.output ~= nil then v91.output else v91.value;
            local v97 = v91.value or "";
            local l_v57_10 = v57;
            l_v57_10.consumed = l_v57_10.consumed .. v97;
            l_v57_10 = v57;
            l_v57_10.index = l_v57_10.index + 0;
        end;
        if (l_v35_0 ~= nil and l_v35_0.type == "text") and v91.type == "text" then
            local l_l_v35_0_0 = l_v35_0;
            l_l_v35_0_0.value = l_l_v35_0_0.value .. v91.value;
            l_v35_0.output = (l_v35_0.output or "") .. v91.value;
            return ;
        else
            v91.prev = l_v35_0;
            table.insert(v36, v91);
            l_v35_0 = v91;
            return ;
        end;
    end;
    local function v106(v101, v102)
        local v103 = l_Object_0.assign({}, v39[v102], {
            conditions = 1,
            inner = ""
        });
        v103.prev = l_v35_0;
        v103.parens = v57.parens;
        v103.output = v57.output;
        local v104 = (not l_Boolean_0.toJSBoolean(v32.capture) and "" or "(") .. v103.open;
        local l_v57_11 = v57;
        l_v57_11.parens = l_v57_11.parens + 1;
        table.insert(v60, "parens");
        v100({
            type = v101,
            value = v102,
            output = if not l_Boolean_0.toJSBoolean(v57.output) then l_ONE_CHAR_0 else ""
        });
        v100({
            type = "paren",
            extglob = true,
            value = l_advance_0(),
            output = v104
        });
        table.insert(v58, v103);
    end;
    local function v112(v107)
        local v108 = v107.close .. (not l_Boolean_0.toJSBoolean(v32.capture) and "" or ")");
        local v109 = nil;
        if v107.type == "negate" then
            local l_v56_0 = v56;
            if (v107.inner ~= nil and #v107.inner > 1) and v107.inner:find("/", 1, true) ~= nil then
                l_v56_0 = ("(%s(?:(?format(v37, l_START_ANCHOR_0, if not l_Boolean_0.toJSBoolean(v32.dot) then l_DOT_LITERAL_0 else l_DOTS_SLASH_0);
            end;
            if not (not (not (l_v56_0 == v56) or v57.index == v34) and not v9("^\\)+$"):test((string.sub(v30, v57.index + 1)))) then
                v107.close = (")$))%s"):format(l_v56_0);
                v108 = v107.close;
            end;
            if v107.inner:find("*", 1, true) ~= nil then
                v109 = string.sub(v30, v57.index + 1);
                if not (not v109 or not v9("^\\.[^\\\\/.]+$"):test(v109)) then
                    v107.close = (")%s)%s)"):format(v29(v109, l_Object_0.assign({}, v31, {
                        fastpaths = false
                    })).output, l_v56_0);
                    v108 = v107.close;
                end;
            end;
            if v107.prev.type == "bos" then
                v57.negatedExtglob = true;
            end;
        end;
        v100({
            type = "paren",
            extglob = true,
            value = v62,
            output = v108
        });
        local l_v57_12 = v57;
        l_v57_12.parens = l_v57_12.parens - 1;
        table.remove(v60);
    end;
    if not (v32.fastpaths ~= false) or v9("([*test(v30) then
        while not (v57.index == v34) do
            v62 = l_advance_0();
            if v62 ~= "\000" then
                if v62 == "\\" then
                    local v113 = l_peek_0();
                    if ((not (v113 == "/") or v32.bash == true) and v113 ~= ".") and v113 ~= ";" then
                        if l_Boolean_0.toJSBoolean(v113) then
                            local v114 = v9("^\\\\+"):exec((string.sub(v30, v57.index + 1)));
                            local v115 = 0;
                            if v114 ~= nil and #v114[1] > 2 then
                                v115 = #v114[1];
                                v57.index = v57.index + v115;
                                if v115 % 2 ~= 0 then
                                    v62 = v62 .. "\\";
                                end;
                            end;
                            v62 = if v32.unescape == true then l_advance_0() else v62 .. l_advance_0();
                            if v57.brackets == 0 then
                                v100({
                                    type = "text",
                                    value = v62
                                });
                                continue;
                            end;
                        else
                            v62 = v62 .. "\\";
                            v100({
                                type = "text",
                                value = v62
                            });
                            continue;
                        end;
                    else
                        continue;
                    end;
                end;
                if v57.brackets > 0 and (not (v62 == "]" and l_v35_0.value ~= "[") or l_v35_0.value == "[^") then
                    if v32.posix ~= false and v62 == ":" then
                        local v116 = l_String_0.slice(l_v35_0.value, 1);
                        if v116:find("[", 1, true) ~= nil then
                            l_v35_0.posix = true;
                            if v116:find(":", 1, true) ~= nil then
                                local v117 = l_String_0.lastIndexOf(l_v35_0.value, "[");
                                local v118 = l_String_0.slice(l_v35_0.value, 1, v117);
                                local v119 = l_POSIX_REGEX_SOURCE_0[l_String_0.slice(l_v35_0.value, v117 + 2)];
                                if v119 then
                                    l_v35_0.value = v118 .. v119;
                                    v57.backtrack = true;
                                    l_advance_0();
                                    if not l_Boolean_0.toJSBoolean(v35.output) and l_Array_0.indexOf(v36, l_v35_0) == 2 then
                                        v35.output = l_ONE_CHAR_0;
                                        continue;
                                    else
                                        continue;
                                    end;
                                end;
                            end;
                        end;
                    end;
                    if not (not (v62 == "[") or l_peek_0() == ":") or v62 == "-" and l_peek_0() == "]" then
                        v62 = ("\\%s"):format(v62);
                    end;
                    if v62 == "]" and (not (l_v35_0.value ~= "[") or l_v35_0.value == "[^") then
                        v62 = ("\\%s"):format(v62);
                    end;
                    if (v32.posix == true and v62 == "") and l_v35_0.value == "[" then
                        v62 = "^";
                    end;
                    l_v35_0.value = l_v35_0.value .. v62;
                    local v120 = {
                        value = v62
                    };
                    v57.output = v57.output .. if v120.output ~= nil then v120.output else v120.value;
                    v57.consumed = v57.consumed .. (v120.value or "");
                    v57.index = v57.index + 0;
                elseif v57.quotes == 1 and v62 ~= "\"" then
                    v62 = v11.escapeRegex(v62);
                    l_v35_0.value = l_v35_0.value .. v62;
                    local v121 = {
                        value = v62
                    };
                    v57.output = v57.output .. if v121.output ~= nil then v121.output else v121.value;
                    v57.consumed = v57.consumed .. (v121.value or "");
                    v57.index = v57.index + 0;
                elseif v62 == "\"" then
                    v57.quotes = v57.quotes == 1 and 0 or 1;
                    if v32.keepQuotes == true then
                        v100({
                            type = "text",
                            value = v62
                        });
                    end;
                elseif v62 == "(" then
                    v57.parens = v57.parens + 1;
                    table.insert(v60, "parens");
                    v100({
                        type = "paren",
                        value = v62
                    });
                elseif v62 == ")" then
                    if v57.parens == 0 and v32.strictBrackets == true then
                        error(l_Error_0.new("SyntaxError: " .. ("Missing %s: \"%s\" - use \"\\%s\" to match literal characters"):format("opening", "(", "(")));
                    end;
                    local v122 = v58[#v58];
                    if v122 ~= nil and v57.parens == v122.parens + 1 then
                        v112((table.remove(v58)));
                    else
                        v100({
                            type = "paren",
                            value = v62,
                            output = not l_Boolean_0.toJSBoolean(v57.parens) and "\\)" or ")"
                        });
                        v57.parens = v57.parens - 1;
                        table.remove(v60);
                    end;
                elseif v62 == "[" then
                    if not (v32.nobracket ~= true) or string.sub(v30, v57.index + 1):find("]", 1, true) == nil then
                        if v32.nobracket ~= true and v32.strictBrackets == true then
                            error(l_Error_0.new("SyntaxError: " .. ("Missing %s: \"%s\" - use \"\\%s\" to match literal characters"):format("closing", "]", "]")));
                        end;
                        v62 = ("\\%s"):format(v62);
                    else
                        v57.brackets = v57.brackets + 1;
                        table.insert(v60, "brackets");
                    end;
                    v100({
                        type = "bracket",
                        value = v62
                    });
                elseif v62 == "]" then
                    if not (v32.nobracket ~= true) or (l_v35_0 ~= nil and l_v35_0.type == "bracket") and #l_v35_0.value == 1 then
                        v100({
                            type = "text",
                            value = v62,
                            output = ("\\%s"):format(v62)
                        });
                    elseif v57.brackets == 0 then
                        if v32.strictBrackets == true then
                            error(l_Error_0.new("SyntaxError: " .. ("Missing %s: \"%s\" - use \"\\%s\" to match literal characters"):format("opening", "[", "[")));
                        end;
                        v100({
                            type = "text",
                            value = v62,
                            output = ("\\%s"):format(v62)
                        });
                    else
                        v57.brackets = v57.brackets - 1;
                        table.remove(v60);
                        local v123 = l_String_0.slice(l_v35_0.value, 2);
                        if (l_v35_0.posix ~= true and v123:sub(1, 1) == "^") and v123:find("/", 1, true) == nil then
                            v62 = ("/%s"):format(v62);
                        end;
                        l_v35_0.value = l_v35_0.value .. v62;
                        local v124 = {
                            value = v62
                        };
                        v57.output = v57.output .. if v124.output ~= nil then v124.output else v124.value;
                        v57.consumed = v57.consumed .. (v124.value or "");
                        v57.index = v57.index + 0;
                        if not (not (v32.literalBrackets ~= false) or v11.hasRegexChars(v123)) then
                            v124 = v11.escapeRegex(l_v35_0.value);
                            v57.output = l_String_0.slice(v57.output, 1, -#l_v35_0.value);
                            if v32.literalBrackets == true then
                                v57.output = v57.output .. v124;
                                l_v35_0.value = v124;
                            else
                                l_v35_0.value = ("(%s%s|%s)"):format(v37, v124, l_v35_0.value);
                                v57.output = v57.output .. l_v35_0.value;
                            end;
                        end;
                    end;
                elseif v62 == "{" and v32.nobrace ~= true then
                    v57.braces = v57.braces + 1;
                    table.insert(v60, "braces");
                    local v125 = {
                        type = "brace",
                        value = v62,
                        output = "(",
                        outputIndex = #v57.output,
                        tokensIndex = #v57.tokens
                    };
                    table.insert(v59, v125);
                    v100(v125);
                elseif v62 == "}" then
                    local v126 = v59[#v59];
                    if v32.nobrace ~= true and l_Boolean_0.toJSBoolean(v126) then
                        local v127 = ")";
                        if v126.dots == true then
                            local v128 = l_Array_0.slice(v36);
                            local v129 = {};
                            for v130 = #v128, 1, -1 do
                                table.remove(v36);
                                if v128[v130].type ~= "brace" then
                                    if v128[v130].type ~= "dots" then
                                        table.insert(v129, 1, v128[v130].value);
                                    end;
                                else
                                    break;
                                end;
                            end;
                            v127 = v21(v129, v32);
                            v57.backtrack = true;
                        end;
                        if v126.comma ~= true and v126.dots ~= true then
                            local v131 = l_String_0.slice(v57.output, 1, v126.outputIndex);
                            local v132 = l_Array_0.slice(v57.tokens, v126.tokensIndex);
                            v126.output = "\\{";
                            v126.value = v126.output;
                            v127 = "\\}";
                            v62 = v127;
                            v57.output = v131;
                            for _, v134 in ipairs(v132) do
                                v57.output = v57.output .. if not l_Boolean_0.toJSBoolean(v134.output) then v134.value else v134.output;
                            end;
                        end;
                        v100({
                            type = "brace",
                            value = v62,
                            output = v127
                        });
                        v57.braces = v57.braces - 1;
                        table.remove(v60);
                        table.remove(v59);
                    else
                        v100({
                            type = "text",
                            value = v62,
                            output = v62
                        });
                    end;
                elseif v62 == "|" then
                    if #v58 > 0 then
                        local v135 = v58[#v58];
                        v135.conditions = v135.conditions + 1;
                    end;
                    v100({
                        type = "text",
                        value = v62
                    });
                elseif v62 == "," then
                    local l_v62_0 = v62;
                    local v137 = v59[#v59];
                    if l_Boolean_0.toJSBoolean(v137) and v60[#v60] == "braces" then
                        v137.comma = true;
                        l_v62_0 = "|";
                    end;
                    v100({
                        type = "comma",
                        value = v62,
                        output = l_v62_0
                    });
                elseif v62 == "/" then
                    if l_v35_0.type == "dot" and v57.index == v57.start + 1 then
                        v57.start = v57.index + 1;
                        v57.consumed = "";
                        v57.output = "";
                        table.remove(v36);
                        l_v35_0 = v35;
                    else
                        v100({
                            type = "slash",
                            value = v62,
                            output = l_SLASH_LITERAL_0
                        });
                    end;
                elseif v62 == "." then
                    if v57.braces > 0 and l_v35_0.type == "dot" then
                        if l_v35_0.value == "." then
                            l_v35_0.output = l_DOT_LITERAL_0;
                        end;
                        local v138 = v59[#v59];
                        l_v35_0.type = "dots";
                        l_v35_0.output = l_v35_0.output .. v62;
                        l_v35_0.value = l_v35_0.value .. v62;
                        v138.dots = true;
                    elseif (v57.braces + v57.parens == 0 and l_v35_0.type ~= "bos") and l_v35_0.type ~= "slash" then
                        v100({
                            type = "text",
                            value = v62,
                            output = l_DOT_LITERAL_0
                        });
                    else
                        v100({
                            type = "dot",
                            value = v62,
                            output = l_DOT_LITERAL_0
                        });
                    end;
                elseif v62 == "?" then
                    if ((not (l_Boolean_0.toJSBoolean(l_v35_0) and l_v35_0.value == "(") and v32.noextglob ~= true) and l_peek_0() == "(") and l_peek_0(2) ~= "?" then
                        v106("qmark", v62);
                    elseif l_Boolean_0.toJSBoolean(l_v35_0) and l_v35_0.type == "paren" then
                        local v139 = l_peek_0();
                        local l_v62_1 = v62;
                        if not (not (v139 == "<") or v11.supportsLookbehinds()) then
                            error(l_Error_0.new("Node.js v10 or higher is required for regex lookbehinds"));
                        end;
                        if not (not (l_v35_0.value == "(" and not v9("[]"):test(v139)) and (not (v139 == "<") or v9("<([test((string.sub(v30, v57.index + 1))))) then
                            l_v62_1 = ("\\%s"):format(v62);
                        end;
                        v100({
                            type = "text",
                            value = v62,
                            output = l_v62_1
                        });
                    elseif v32.dot ~= true and (not (l_v35_0.type ~= "slash") or l_v35_0.type == "bos") then
                        v100({
                            type = "qmark",
                            value = v62,
                            output = l_QMARK_NO_DOT_0
                        });
                    else
                        v100({
                            type = "qmark",
                            value = v62,
                            output = l_QMARK_0
                        });
                    end;
                else
                    if v62 == "" then
                        if not (v32.noextglob ~= true and l_peek_0() == "(") or l_peek_0(2) == "?" and v9("[]"):test(l_peek_0(3)) then
                            if v32.nonegate ~= true and v57.index == 1 then
                                v84();
                                continue;
                            end;
                        else
                            v106("negate", v62);
                            continue;
                        end;
                    end;
                    if v62 == "+" then
                        if (v32.noextglob ~= true and l_peek_0() == "(") and l_peek_0(2) ~= "?" then
                            v106("plus", v62);
                        elseif not (not (l_v35_0 ~= nil) or l_v35_0.value ~= "(") or v32.regex == false then
                            v100({
                                type = "plus",
                                value = v62,
                                output = l_PLUS_LITERAL_0
                            });
                        elseif not (not (l_v35_0 ~= nil) or (l_v35_0.type ~= "bracket" and l_v35_0.type ~= "paren") and l_v35_0.type ~= "brace") or v57.parens > 0 then
                            v100({
                                type = "plus",
                                value = v62
                            });
                        else
                            v100({
                                type = "plus",
                                value = l_PLUS_LITERAL_0
                            });
                        end;
                    elseif v62 == "@" then
                        if (v32.noextglob ~= true and l_peek_0() == "(") and l_peek_0(2) ~= "?" then
                            v100({
                                type = "at",
                                extglob = true,
                                value = v62,
                                output = ""
                            });
                        else
                            v100({
                                type = "text",
                                value = v62
                            });
                        end;
                    elseif v62 ~= "*" then
                        if not (v62 ~= "$") or v62 == "^" then
                            v62 = ("\\%s"):format(v62);
                        end;
                        local v141 = string.match(string.sub(v30, v57.index + 1), l_REGEX_NON_SPECIAL_CHARS_0);
                        if v141 ~= nil then
                            v62 = v62 .. v141;
                            v57.index = v57.index + #v141;
                        end;
                        v100({
                            type = "text",
                            value = v62
                        });
                    elseif l_v35_0 ~= nil and (not (l_v35_0.type ~= "globstar") or l_v35_0.star == true) then
                        l_v35_0.type = "star";
                        l_v35_0.star = true;
                        l_v35_0.value = l_v35_0.value .. v62;
                        l_v35_0.output = v56;
                        v57.backtrack = true;
                        v57.globstar = true;
                        v57.consumed = v57.consumed .. (v62 or "");
                        v57.index = v57.index + 0;
                    else
                        local v142 = string.sub(v30, v57.index + 1);
                        local l_toJSBoolean_0 = l_Boolean_0.toJSBoolean;
                        local v144 = false;
                        if v32.noextglob ~= true then
                            v144 = v9("^\\([^?]"):test(v142);
                        end;
                        if not l_toJSBoolean_0(v144) then
                            if l_v35_0.type == "star" then
                                if v32.noglobstar == true then
                                    v57.consumed = v57.consumed .. (v62 or "");
                                    v57.index = v57.index + 0;
                                else
                                    l_toJSBoolean_0 = l_v35_0.prev;
                                    v144 = l_toJSBoolean_0.prev;
                                    local v145 = true;
                                    if l_toJSBoolean_0.type ~= "slash" then
                                        v145 = l_toJSBoolean_0.type == "bos";
                                    end;
                                    local v146;
                                    if not l_Boolean_0.toJSBoolean(v144) then
                                        v146 = v144;
                                    else
                                        v146 = true;
                                        if v144.type ~= "star" then
                                            v146 = v144.type == "globstar";
                                        end;
                                    end;
                                    if v32.bash == true and (not v145 or v142:sub(1, 1) ~= nil and v142:sub(1, 1) ~= "/") then
                                        v100({
                                            type = "star",
                                            value = v62,
                                            output = ""
                                        });
                                    else
                                        local v147 = false;
                                        if v57.braces > 0 then
                                            v147 = true;
                                            if l_toJSBoolean_0.type ~= "comma" then
                                                v147 = l_toJSBoolean_0.type == "brace";
                                            end;
                                        end;
                                        local v148 = false;
                                        if #v58 > 0 then
                                            v148 = true;
                                            if l_toJSBoolean_0.type ~= "pipe" then
                                                v148 = l_toJSBoolean_0.type == "paren";
                                            end;
                                        end;
                                        if (not (not v145 and l_toJSBoolean_0.type ~= "paren") or v147) or v148 then
                                            while l_String_0.slice(v142, 1, 4) == "/**" do
                                                local v149 = v30:sub(v57.index + 4, v57.index + 4);
                                                if not l_Boolean_0.toJSBoolean(v149) or v149 == "/" then
                                                    v142 = l_String_0.slice(v142, 4);
                                                    v57.consumed = v57.consumed .. "/**";
                                                    v57.index = v57.index + 3;
                                                else
                                                    break;
                                                end;
                                            end;
                                            if not (l_toJSBoolean_0.type == "bos") or not (v57.index == v34) then
                                                if (not (l_toJSBoolean_0.type == "slash" and l_toJSBoolean_0.prev.type ~= "bos") or l_Boolean_0.toJSBoolean(v146)) or not (v57.index == v34) then
                                                    if (l_toJSBoolean_0.type == "slash" and l_toJSBoolean_0.prev.type ~= "bos") and v142:sub(1, 1) == "/" then
                                                        local v150 = v142:sub(2, 2) ~= nil and "|$" or "";
                                                        v57.output = l_String_0.slice(v57.output, 1, -#(l_toJSBoolean_0.output .. l_v35_0.output));
                                                        l_toJSBoolean_0.output = ("(?:%s"):format(l_toJSBoolean_0.output);
                                                        l_v35_0.type = "globstar";
                                                        l_v35_0.output = ("%s%s|%s%s)"):format(("(%s(?:(?format(v37, l_START_ANCHOR_0, if not l_Boolean_0.toJSBoolean(v32.dot) then l_DOT_LITERAL_0 else l_DOTS_SLASH_0), l_SLASH_LITERAL_0, l_SLASH_LITERAL_0, v150);
                                                        l_v35_0.value = l_v35_0.value .. v62;
                                                        v57.output = v57.output .. l_toJSBoolean_0.output .. l_v35_0.output;
                                                        v57.globstar = true;
                                                        v57.consumed = v57.consumed .. (v62 .. l_advance_0() or "");
                                                        v57.index = v57.index + 0;
                                                        v100({
                                                            type = "slash",
                                                            value = "/",
                                                            output = ""
                                                        });
                                                    elseif l_toJSBoolean_0.type == "bos" and v142:sub(1, 1) == "/" then
                                                        l_v35_0.type = "globstar";
                                                        l_v35_0.value = l_v35_0.value .. v62;
                                                        l_v35_0.output = ("(?:|%s|%s%s)"):format(l_SLASH_LITERAL_0, ("(%s(?:(?format(v37, l_START_ANCHOR_0, if not l_Boolean_0.toJSBoolean(v32.dot) then l_DOT_LITERAL_0 else l_DOTS_SLASH_0), l_SLASH_LITERAL_0);
                                                        v57.output = l_v35_0.output;
                                                        v57.globstar = true;
                                                        v57.consumed = v57.consumed .. (v62 .. l_advance_0() or "");
                                                        v57.index = v57.index + 0;
                                                        v100({
                                                            type = "slash",
                                                            value = "/",
                                                            output = ""
                                                        });
                                                    else
                                                        v57.output = l_String_0.slice(v57.output, 1, -#l_v35_0.output);
                                                        l_v35_0.type = "globstar";
                                                        l_v35_0.output = ("(%s(?:(?format(v37, l_START_ANCHOR_0, if not l_Boolean_0.toJSBoolean(v32.dot) then l_DOT_LITERAL_0 else l_DOTS_SLASH_0);
                                                        l_v35_0.value = l_v35_0.value .. v62;
                                                        v57.output = v57.output .. l_v35_0.output;
                                                        v57.globstar = true;
                                                        v57.consumed = v57.consumed .. (v62 or "");
                                                        v57.index = v57.index + 0;
                                                    end;
                                                else
                                                    v57.output = l_String_0.slice(v57.output, 1, -#(l_toJSBoolean_0.output .. l_v35_0.output));
                                                    l_toJSBoolean_0.output = ("(?:%s"):format(l_toJSBoolean_0.output);
                                                    l_v35_0.type = "globstar";
                                                    l_v35_0.output = ("(%s(?:(?format(v37, l_START_ANCHOR_0, if not l_Boolean_0.toJSBoolean(v32.dot) then l_DOT_LITERAL_0 else l_DOTS_SLASH_0) .. (not v32.strictSlashes and "|$)" or ")");
                                                    l_v35_0.value = l_v35_0.value .. v62;
                                                    v57.globstar = true;
                                                    v57.output = v57.output .. l_toJSBoolean_0.output .. l_v35_0.output;
                                                    v57.consumed = v57.consumed .. (v62 or "");
                                                    v57.index = v57.index + 0;
                                                end;
                                            else
                                                l_v35_0.type = "globstar";
                                                l_v35_0.value = l_v35_0.value .. v62;
                                                l_v35_0.output = ("(%s(?:(?format(v37, l_START_ANCHOR_0, if not l_Boolean_0.toJSBoolean(v32.dot) then l_DOT_LITERAL_0 else l_DOTS_SLASH_0);
                                                v57.output = l_v35_0.output;
                                                v57.globstar = true;
                                                v57.consumed = v57.consumed .. (v62 or "");
                                                v57.index = v57.index + 0;
                                            end;
                                        else
                                            v100({
                                                type = "star",
                                                value = v62,
                                                output = ""
                                            });
                                        end;
                                    end;
                                end;
                            else
                                l_toJSBoolean_0 = {
                                    type = "star",
                                    value = v62,
                                    output = v56
                                };
                                if v32.bash == true then
                                    l_toJSBoolean_0.output = ".*?";
                                    if not (l_v35_0.type ~= "bos") or l_v35_0.type == "slash" then
                                        l_toJSBoolean_0.output = v54 .. l_toJSBoolean_0.output;
                                    end;
                                    v100(l_toJSBoolean_0);
                                elseif (l_v35_0 ~= nil and (not (l_v35_0.type ~= "bracket") or l_v35_0.type == "paren")) and v32.regex == true then
                                    l_toJSBoolean_0.output = v62;
                                    v100(l_toJSBoolean_0);
                                else
                                    if not (v57.index ~= v57.start and l_v35_0.type ~= "slash") or l_v35_0.type == "dot" then
                                        if l_v35_0.type == "dot" then
                                            v57.output = v57.output .. l_NO_DOT_SLASH_0;
                                            l_v35_0.output = l_v35_0.output .. l_NO_DOT_SLASH_0;
                                        elseif v32.dot == true then
                                            v57.output = v57.output .. l_NO_DOTS_SLASH_0;
                                            l_v35_0.output = l_v35_0.output .. l_NO_DOTS_SLASH_0;
                                        else
                                            v57.output = v57.output .. v54;
                                            l_v35_0.output = l_v35_0.output .. v54;
                                        end;
                                        if l_peek_0() ~= "*" then
                                            v57.output = v57.output .. l_ONE_CHAR_0;
                                            l_v35_0.output = l_v35_0.output .. l_ONE_CHAR_0;
                                        end;
                                    end;
                                    v100(l_toJSBoolean_0);
                                end;
                            end;
                        else
                            v106("star", v62);
                        end;
                    end;
                end;
            end;
        end;
        while v57.brackets > 0 do
            if v32.strictBrackets == true then
                error(l_Error_0.new("SyntaxError: " .. ("Missing %s: \"%s\" - use \"\\%s\" to match literal characters"):format("closing", "]", "]")));
            end;
            v57.output = v11.escapeLast(v57.output, "[");
            v57.brackets = v57.brackets - 1;
            table.remove(v60);
        end;
        while v57.parens > 0 do
            if v32.strictBrackets == true then
                error(l_Error_0.new("SyntaxError: " .. ("Missing %s: \"%s\" - use \"\\%s\" to match literal characters"):format("closing", ")", ")")));
            end;
            v57.output = v11.escapeLast(v57.output, "(");
            v57.parens = v57.parens - 1;
            table.remove(v60);
        end;
        while v57.braces > 0 do
            if v32.strictBrackets == true then
                error(l_Error_0.new("SyntaxError: " .. ("Missing %s: \"%s\" - use \"\\%s\" to match literal characters"):format("closing", "}", "}")));
            end;
            v57.output = v11.escapeLast(v57.output, "{");
            v57.braces = v57.braces - 1;
            table.remove(v60);
        end;
        if v32.strictSlashes ~= true and (not (l_v35_0.type ~= "star") or l_v35_0.type == "bracket") then
            v100({
                type = "maybe_slash",
                value = "",
                output = ("%s?"):format(l_SLASH_LITERAL_0)
            });
        end;
        if v57.backtrack == true then
            v57.output = "";
            for _, v152 in ipairs(v57.tokens) do
                v57.output = v57.output .. if v152.output ~= nil then v152.output else v152.value;
                if v152.suffix then
                    v57.output = v57.output .. v152.suffix;
                end;
            end;
        end;
        return v57;
    else
        local v153 = false;
        local v160 = l_stringReplace_0(v30, l_REGEX_SPECIAL_CHARS_BACKREF_0, function(v154, v155, v156, v157, v158, v159)
            if v157 == "\\" then
                v153 = true;
                return v154;
            elseif v157 == "?" then
                if not l_Boolean_0.toJSBoolean(v155) then
                    if v159 == 0 then
                        return v55 .. if v158 ~= nil then string.rep(l_QMARK_0, #v158) else "";
                    else
                        return string.rep(l_QMARK_0, #v156);
                    end;
                else
                    return v155 .. v157 .. if v158 ~= nil then string.rep(l_QMARK_0, #v158) else "";
                end;
            elseif v157 == "." then
                return string.rep(l_DOT_LITERAL_0, #v156);
            elseif v157 == "*" then
                if not l_Boolean_0.toJSBoolean(v155) then
                    return v56;
                else
                    return v155 .. v157 .. if v158 ~= nil then v56 else "";
                end;
            elseif not l_Boolean_0.toJSBoolean(v155) then
                return (("\\%s"):format(v154));
            else
                return v154;
            end;
        end);
        if v153 == true then
            if v32.unescape == true then
                error("not implemented");
            else
                error("not implemented");
            end;
        end;
        if v160 == v30 and v32.contains == true then
            v57.output = v30;
            return v57;
        else
            v57.output = v11.wrapOutput(v160, v57, v31);
            return v57;
        end;
    end;
end;
v29.fastpaths = function(v161, v162)
    local v163 = l_Object_0.assign({}, v162);
    local v164 = if typeof(v163.maxLength) == "number" then math.min(l_MAX_LENGTH_0, v163.maxLength) else l_MAX_LENGTH_0;
    local v165 = #v161;
    if v164 < v165 then
        error(l_Error_0.new(("SyntaxError: Input length: %s, exceeds maximum allowed length: %s"):format(tostring(v165), (tostring(v164)))));
    end;
    v161 = not not l_Boolean_0.toJSBoolean(l_REPLACEMENTS_0[v161]) and l_REPLACEMENTS_0[v161] or v161;
    local v166 = v10.globChars((v11.isWindows(v162)));
    local l_DOT_LITERAL_1 = v166.DOT_LITERAL;
    local l_SLASH_LITERAL_1 = v166.SLASH_LITERAL;
    local l_ONE_CHAR_1 = v166.ONE_CHAR;
    local l_DOTS_SLASH_1 = v166.DOTS_SLASH;
    local l_NO_DOT_1 = v166.NO_DOT;
    local l_NO_DOTS_0 = v166.NO_DOTS;
    local l_NO_DOTS_SLASH_1 = v166.NO_DOTS_SLASH;
    local l_STAR_1 = v166.STAR;
    local l_START_ANCHOR_1 = v166.START_ANCHOR;
    local v176 = if not l_Boolean_0.toJSBoolean(v163.dot) then l_NO_DOT_1 else l_NO_DOTS_0;
    local v177 = if not l_Boolean_0.toJSBoolean(v163.dot) then l_NO_DOT_1 else l_NO_DOTS_SLASH_1;
    local v178 = not l_Boolean_0.toJSBoolean(v163.capture) and "?:" or "";
    local v179 = {
        negated = false,
        prefix = ""
    };
    local v180 = v163.bash == true and ".*?" or l_STAR_1;
    if l_Boolean_0.toJSBoolean(v163.capture) then
        v180 = ("(%s)"):format(v180);
    end;
    local function _(v181)
        if v181.noglobstar == true then
            return v180;
        else
            return ("(%s(?:(?format(v178, l_START_ANCHOR_1, if not l_Boolean_0.toJSBoolean(v181.dot) then l_DOT_LITERAL_1 else l_DOTS_SLASH_1);
        end;
    end;
    local function v183(v184)
        if v184 == "*" then
            return ("%s%s%s"):format(v176, l_ONE_CHAR_1, v180);
        elseif v184 == ".*" then
            return ("%s%s%s"):format(l_DOT_LITERAL_1, l_ONE_CHAR_1, v180);
        elseif v184 == "*.*" then
            return ("%s%s%s%s%s"):format(v176, v180, l_DOT_LITERAL_1, l_ONE_CHAR_1, v180);
        elseif v184 == "*/*" then
            return ("%s%s%s%s%s%s"):format(v176, v180, l_SLASH_LITERAL_1, l_ONE_CHAR_1, v177, v180);
        elseif v184 == "**" then
            local l_v176_0 = v176;
            local l_v163_0 = v163;
            return l_v176_0 .. if l_v163_0.noglobstar == true then v180 else ("(%s(?:(?format(v178, l_START_ANCHOR_1, if not l_Boolean_0.toJSBoolean(l_v163_0.dot) then l_DOT_LITERAL_1 else l_DOTS_SLASH_1);
        elseif v184 == "**/*" then
            local v187 = "(?:%s%s%s)?%s%s%s";
            local l_v176_1 = v176;
            local l_v163_1 = v163;
            return v187:format(l_v176_1, if l_v163_1.noglobstar == true then v180 else ("(%s(?:(?format(v178, l_START_ANCHOR_1, if not l_Boolean_0.toJSBoolean(l_v163_1.dot) then l_DOT_LITERAL_1 else l_DOTS_SLASH_1), l_SLASH_LITERAL_1, v177, l_ONE_CHAR_1, v180);
        elseif v184 == "**/*.*" then
            local v190 = "(?:%s%s%s)?%s%s%s%s%s";
            local l_v176_2 = v176;
            local l_v163_2 = v163;
            return v190:format(l_v176_2, if l_v163_2.noglobstar == true then v180 else ("(%s(?:(?format(v178, l_START_ANCHOR_1, if not l_Boolean_0.toJSBoolean(l_v163_2.dot) then l_DOT_LITERAL_1 else l_DOTS_SLASH_1), l_SLASH_LITERAL_1, v177, v180, l_DOT_LITERAL_1, l_ONE_CHAR_1, v180);
        elseif v184 == "**/.*" then
            local v193 = "(?:%s%s%s)?%s%s%s";
            local l_v176_3 = v176;
            local l_v163_3 = v163;
            return v193:format(l_v176_3, if l_v163_3.noglobstar == true then v180 else ("(%s(?:(?format(v178, l_START_ANCHOR_1, if not l_Boolean_0.toJSBoolean(l_v163_3.dot) then l_DOT_LITERAL_1 else l_DOTS_SLASH_1), l_SLASH_LITERAL_1, l_DOT_LITERAL_1, l_ONE_CHAR_1, v180);
        else
            local v196 = v9("^(.*?)\\.(\\w+)$"):exec(v184);
            if l_Boolean_0.toJSBoolean(v196) then
                local v197 = v183(v196[2]);
                if l_Boolean_0.toJSBoolean(v197) then
                    return v197 .. l_DOT_LITERAL_1 .. v196[3];
                else
                    return nil;
                end;
            else
                return nil;
            end;
        end;
    end;
    local v198 = v183((v11.removePrefix(v161, v179)));
    if not (not (v198 ~= nil) or not l_Boolean_0.toJSBoolean(v198)) and v163.strictSlashes ~= true then
        v198 = v198 .. ("%s?"):format(l_SLASH_LITERAL_1);
    end;
    return v198;
end;
return v29;


local l_Parent_0 = script.Parent;
local l_Parent_1 = l_Parent_0.Parent;
local v2 = require(l_Parent_1.LuauPolyfill);
local l_Array_0 = v2.Array;
local l_Boolean_0 = v2.Boolean;
local l_Error_0 = v2.Error;
local l_Object_0 = v2.Object;
local v7 = require(l_Parent_1.RegExp);
local v8 = require(l_Parent_0.scan);
local v9 = require(l_Parent_0.parse);
local v10 = require(l_Parent_0.utils);
local v11 = require(l_Parent_0.constants);
local function _(v12)
    local v13 = false;
    if typeof(v12) == "table" then
        v13 = not l_Array_0.isArray(v12);
    end;
    return v13;
end;
local v15 = nil;
local v20 = setmetatable({}, {
    __call = function(_, v17, v18, v19)
        return v15(v17, v18, v19);
    end
});
v15 = function(v21, v22, v23)
    local v24 = v23 or false;
    if not l_Array_0.isArray(v21) then
        local v25 = false;
        if typeof(v21) == "table" then
            v25 = not l_Array_0.isArray(v21);
        end;
        if v25 then
            v25 = l_Boolean_0.toJSBoolean(v21.tokens) and l_Boolean_0.toJSBoolean(v21.input);
        end;
        if not (v21 ~= "" and (not (typeof(v21) ~= "string") or v25)) then
            error(l_Error_0.new("TypeError: Expected pattern to be a non-empty string"));
        end;
        local v26 = v22 or {};
        local v27 = v10.isWindows(v22);
        local v28 = if not v25 then v20.makeRe(v21, v22, false, true) else v20.compileRe(v21, v22);
        local l_state_0 = v28.state;
        v28.state = nil;
        local v30 = nil;
        v30 = function(_)
            return false;
        end;
        if l_Boolean_0.toJSBoolean(v26.ignore) then
            v30 = v20(v26.ignore, l_Object_0.assign({}, v22, {
                ignore = l_Object_0.None,
                onMatch = l_Object_0.None,
                onResult = l_Object_0.None
            }), v24);
        end;
        local v32 = nil;
        local v36 = setmetatable({}, {
            __call = function(_, v34, v35)
                return v32(v34, v35);
            end
        });
        v32 = function(v37, v38)
            local v39 = v38 or false;
            local v40 = v20.test(v37, v28, v22, {
                glob = v21,
                posix = v27
            });
            local l_isMatch_0 = v40.isMatch;
            local v42 = {
                glob = v21,
                state = l_state_0,
                regex = v28,
                posix = v27,
                input = v37,
                output = v40.output,
                match = v40.match,
                isMatch = l_isMatch_0
            };
            if typeof(v26.onResult) == "function" then
                v26.onResult(v42);
            end;
            if l_isMatch_0 == false then
                v42.isMatch = false;
                if not v39 then
                    return false;
                else
                    return v42;
                end;
            elseif not v30(v37) then
                if typeof(v26.onMatch) == "function" then
                    v26.onMatch(v42);
                end;
                if not v39 then
                    return true;
                else
                    return v42;
                end;
            else
                if typeof(v26.onIgnore) == "function" then
                    v26.onIgnore(v42);
                end;
                v42.isMatch = false;
                if not v39 then
                    return false;
                else
                    return v42;
                end;
            end;
        end;
        if l_Boolean_0.toJSBoolean(v24) then
            v36.state = l_state_0;
        end;
        return v36;
    else
        local v44 = l_Array_0.map(v21, function(v43)
            return v20(v43, v22, v24);
        end);
        local v45 = nil;
        local v48 = setmetatable({}, {
            __call = function(_, v47)
                return v45(v47);
            end
        });
        v45 = function(v49)
            for _, v51 in ipairs(v44) do
                local v52 = v51(v49);
                if v52 then
                    return v52;
                end;
            end;
            return false;
        end;
        return v48;
    end;
end;
v20.test = function(v53, v54, v55, v56)
    local v57 = v56 or {};
    local l_glob_0 = v57.glob;
    local l_posix_0 = v57.posix;
    if typeof(v53) ~= "string" then
        error(l_Error_0.new("TypeError: Expected input to be a string"));
    end;
    if v53 == "" then
        return {
            isMatch = false,
            output = ""
        };
    else
        local v60 = v55 or {};
        local v61 = if not l_Boolean_0.toJSBoolean(v60.format) then if l_Boolean_0.toJSBoolean(l_posix_0) then v10.toPosixSlashes else nil else v60.format;
        local v62 = v53 == l_glob_0;
        local v63 = if not not v62 and l_Boolean_0.toJSBoolean(v61) then v61(v53) else v53;
        if v62 == false then
            v63 = if not l_Boolean_0.toJSBoolean(v61) then v53 else v61(v53);
            v62 = v63 == l_glob_0;
        end;
        if not (v62 ~= false) or v60.capture == true then
            v62 = if not (v60.matchBase ~= true) or v60.basename == true then v20.matchBase(v53, v54, v55, l_posix_0) else v54:exec(v63);
        end;
        return {
            isMatch = l_Boolean_0.toJSBoolean(v62),
            match = v62,
            output = v63
        };
    end;
end;
v20.matchBase = function(_, _, _, _)
    error("matchBase not implemented");
end;
v20.isMatch = function(v68, v69, v70)
    return v20(v69, v70)(v68);
end;
v20.parse = function(v71, v72)
    if not l_Array_0.isArray(v71) then
        return v9(v71, l_Object_0.assign({}, v72, {
            fastpaths = false
        }));
    else
        return l_Array_0.map(v71, function(v73)
            return v20.parse(v73, v72);
        end);
    end;
end;
v20.scan = function(v74, v75)
    return v8(v74, v75);
end;
v20.compileRe = function(v76, v77, v78, v79)
    local v80 = v78 or false;
    local v81 = v79 or false;
    if v80 == true then
        return v76.output;
    else
        local v82 = v77 or {};
        local v83 = ("%s(?:%s)%s"):format(not l_Boolean_0.toJSBoolean(v82.contains) and "^" or "", tostring(v76.output), not l_Boolean_0.toJSBoolean(v82.contains) and "$" or "");
        if typeof(v76) == "table" and v76.negated == true then
            v83 = ("(?format(v83);
        end;
        local v84 = v20.toRegex(v83, v77);
        if v81 == true then
            v84.state = v76;
        end;
        return v84;
    end;
end;
v20.makeRe = function(v85, v86, v87, v88)
    local v89 = v86 or {};
    local v90 = v87 or false;
    local v91 = v88 or false;
    if not l_Boolean_0.toJSBoolean(v85) or typeof(v85) ~= "string" then
        error(l_Error_0.new("TypeError: Expected a non-empty string"));
    end;
    local v92 = {
        negated = false,
        fastpaths = true
    };
    if v89.fastpaths ~= false and (not (string.sub(v85, 1, 1) ~= ".") or string.sub(v85, 1, 1) == "*") then
        v92.output = v9.fastpaths(v85, v89);
    end;
    if not l_Boolean_0.toJSBoolean(v92.output) then
        v92 = v9(v85, v89);
    end;
    return v20.compileRe(v92, v89, v90, v91);
end;
v20.toRegex = function(v93, v94)
    local l_status_0, l_result_0 = pcall(function()
        local v95 = v94 or {};
        return v7(v93, not not l_Boolean_0.toJSBoolean(v95.flags) and v95.flags or (l_Boolean_0.toJSBoolean(v95.nocase) and "i" or ""));
    end);
    if l_status_0 then
        return l_result_0;
    else
        if v94 ~= nil and v94.debug == true then
            error(l_result_0);
        end;
        return v7("$^");
    end;
end;
v20.constants = v11;
return v20;