PageSourceSearch

https://sixsigmafunnels.com/src/app/pages/roles/rolePermissions.tsx

js sixsigmafunnels.com collected 2026-10-02 01:44:35 UTC 32,653 bytes, 277 lines download raw bytes

1import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/src/app/pages/roles/rolePermissions.tsx");if (!window.$RefreshReg$) throw new Error("React refresh preamble was not loaded. Something is wrong.");
2const prevRefreshReg = window.$RefreshReg$;
3const prevRefreshSig = window.$RefreshSig$;
4window.$RefreshReg$ = RefreshRuntime.getRefreshReg("/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx");
5window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;
6
7import * as RefreshRuntime from "/@react-refresh";
8
9import __vite__cjsImport1_react_jsxDevRuntime from "/node_modules/.vite/deps/react_jsx-dev-runtime.js?v=e8ce80ae"; const _jsxDEV = __vite__cjsImport1_react_jsxDevRuntime["jsxDEV"];
10var _s = $RefreshSig$();
11import __vite__cjsImport2_react from "/node_modules/.vite/deps/react.js?v=e8ce80ae"; const React = __vite__cjsImport2_react.__esModule ? __vite__cjsImport2_react.default : __vite__cjsImport2_react; const useEffect = __vite__cjsImport2_react["useEffect"]; const useState = __vite__cjsImport2_react["useState"];
12import { Link, useLocation, useNavigate } from "/node_modules/.vite/deps/react-router-dom.js?v=e8ce80ae";
13import axios from "/node_modules/.vite/deps/axios.js?v=e8ce80ae";
14import { CUREENT_COMPANY_NAME, GET_PERMISSIONS_BY_ROLE_ID, POST_ROLE_PERMISSIONS_BY_ROLE_ID } from "/src/app/Constants.tsx";
15import { TextField } from "/node_modules/.vite/deps/@mui_material.js?v=e8ce80ae";
16import { Content } from "/src/config/layout/components/Content.tsx";
17import "/src/app/pages/roles/css/rolePermissions.scss";
18import { disableSplashScreen, enableSplashScreen } from "/src/app/pages/common/CommonUtilities.tsx";
19import { useAxiosInterceptor } from "/src/app/useAxiosInterceptor.ts";
20export function EditRolePermissions() {
21    _s();
22    useAxiosInterceptor();
23    const location = useLocation();
24    const queryParams = new URLSearchParams(location.search);
25    let roleId = queryParams.get('roleId');
26    // State to hold role details
27    const [roleDetails, setRoleDetails] = useState(null);
28    const [originalPermissions, setOriginalPermissions] = useState([]);
29    const [removedPermissions, setRemovedPermissions] = useState([]); // Store UUIDs of removed permissions
30    const [addedPermissions, setAddedPermissions] = useState([]);
31    const navigate = useNavigate();
32    useEffect(()=>{
33        const fetchRoleDetails = async (roleId)=>{
34            if (!roleId) {
35                console.error("roleId is null.");
36                return;
37            }
38            try {
39                enableSplashScreen();
40                const url = GET_PERMISSIONS_BY_ROLE_ID(CUREENT_COMPANY_NAME).replace('{roleId}', roleId);
41                const response = await axios.get(url);
42                setRoleDetails(response.data); // Set the fetched data to state               
43                // Set original permissions to only those that are selected
44                const selectedPermissions = response.data.permissionDetailsDTO.filter((dto)=>dto.isSelected);
45                setOriginalPermissions(selectedPermissions); // Set original permissions
46            } catch (error) {
47                console.error("Error fetching role details:", error);
48            } finally{
49                disableSplashScreen();
50            }
51        };
52        fetchRoleDetails(roleId);
53    }, [
54        roleId
55    ]); // Dependency array to re-run effect if roleId changes
56    // Handle change for the role name
57    const handleRoleNameChange = (newName)=>{
58        if (roleDetails) {
59            setRoleDetails({
60                ...roleDetails,
61                name: newName
62            });
63        }
64    };
65    const handleCheckboxChange = (id)=>{
66        if (roleDetails) {
67            const updatedPermissions = roleDetails.permissionDetailsDTO.map((dto)=>dto.id === id ? {
68                    ...dto,
69                    isSelected: !dto.isSelected
70                } : dto);
71            setRoleDetails({
72                ...roleDetails,
73                permissionDetailsDTO: updatedPermissions
74            });
75            const permission = updatedPermissions.find((dto)=>dto.id === id);
76            if (permission) {
77                if (!permission.isSelected) {
78                    // If the permission is being unchecked
79                    const originalPermission = originalPermissions.find((original)=>original.id === permission.id);
80                    if (originalPermission) {
81                        // If it exists in originalPermissions, add it to removedPermissions
82                        setRemovedPermissions((prev)=>[
83                                ...prev,
84                                originalPermission.uuid
85                            ]);
86                    }
87                } else {
88                    // If the permission is being checked
89                    setRemovedPermissions((prev)=>prev.filter((uuid)=>uuid !== permission.uuid));
90                }
91            }
92            // Determine added permissions
93            const addedPermissions = updatedPermissions.filter((updated)=>updated.isSelected && !originalPermissions.some((original)=>original.id === updated.id));
94            setAddedPermissions(addedPermissions.map((p)=>p.uuid));
95        }
96    };
97    const handleSave = async ()=>{
98        console.log("added Permissions are " + addedPermissions);
99        console.log("removed Permissions are " + removedPermissions);
100        if (!roleId) {
101            console.error("roleId is null.");
102            return;
103        }
104        try {
105            enableSplashScreen();
106            let url = POST_ROLE_PERMISSIONS_BY_ROLE_ID(CUREENT_COMPANY_NAME).replace('{roleId}', roleId);
107            console.log("Updated roleApiUrl: ", url);
108            // Create a new object to send
109            const dataToSend = {
110                ...roleDetails,
111                addPermissions: addedPermissions,
112                removePermissions: removedPermissions // Add the removedPermissions
113            };
114            const response = await axios.post(url, dataToSend);
115            console.log("Response:", response.data);
116            if (response.status === 200) {
117                console.log("permissions updated");
118                navigate(`/${CUREENT_COMPANY_NAME}/administration/roles?role=${roleDetails?.name}`);
119            }
120        } catch (error) {
121            console.error("Error saving permissions:", error);
122        } finally{
123            disableSplashScreen();
124        }
125    };
126    return /*#__PURE__*/ _jsxDEV(Content, {
127        children: /*#__PURE__*/ _jsxDEV("div", {
128            className: "container-fluid role-permissions",
129            children: roleDetails ? /*#__PURE__*/ _jsxDEV("form", {
130                children: [
131                    /*#__PURE__*/ _jsxDEV("div", {
132                        className: "container",
133                        children: [
134                            /*#__PURE__*/ _jsxDEV("h3", {
135                                className: "edit_heading",
136                                children: [
137                                    "Edit Role of ",
138                                    roleDetails.name || ''
139                                ]
140                            }, void 0, true, {
141                                fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
142                                lineNumber: 154,
143                                columnNumber: 29
144                            }, this),
145                            /*#__PURE__*/ _jsxDEV("div", {
146                                className: "role_name",
147                                children: /*#__PURE__*/ _jsxDEV(TextField, {
148                                    type: "text",
149                                    value: roleDetails.name || '',
150                                    name: "rolename",
151                                    label: "Role Name",
152                                    onChange: (e)=>handleRoleNameChange(e.target.value)
153                                }, void 0, false, {
154                                    fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
155                                    lineNumber: 156,
156                                    columnNumber: 33
157                                }, this)
158                            }, void 0, false, {
159                                fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
160                                lineNumber: 155,
161                                columnNumber: 29
162                            }, this),
163                            /*#__PURE__*/ _jsxDEV("div", {
164                                className: "permissions",
165                                children: roleDetails.permissionDetailsDTO.map((dto)=>/*#__PURE__*/ _jsxDEV("div", {
166                                        className: "permission_name",
167                                        children: [
168                                            /*#__PURE__*/ _jsxDEV("input", {
169                                                type: "checkbox",
170                                                name: "permissionValue",
171                                                className: "permission_checkbox",
172                                                checked: dto.isSelected,
173                                                onChange: ()=>handleCheckboxChange(dto.id)
174                                            }, void 0, false, {
175                                                fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
176                                                lineNumber: 167,
177                                                columnNumber: 41
178                                            }, this),
179                                            /*#__PURE__*/ _jsxDEV("label", {
180                                                children: dto.name
181                                            }, void 0, false, {
182                                                fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
183                                                lineNumber: 174,
184                                                columnNumber: 41
185                                            }, this)
186                                        ]
187                                    }, dto.id, true, {
188                                        fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
189                                        lineNumber: 166,
190                                        columnNumber: 37
191                                    }, this))
192                            }, void 0, false, {
193                                fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
194                                lineNumber: 164,
195                                columnNumber: 29
196                            }, this)
197                        ]
198                    }, void 0, true, {
199                        fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
200                        lineNumber: 152,
201                        columnNumber: 25
202                    }, this),
203                    /*#__PURE__*/ _jsxDEV("div", {
204                        className: "action-btns",
205                        children: [
206                            /*#__PURE__*/ _jsxDEV("div", {
207                                className: "btn btn-primary mx-3",
208                                onClick: handleSave,
209                                children: "Save"
210                            }, void 0, false, {
211                                fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
212                                lineNumber: 181,
213                                columnNumber: 29
214                            }, this),
215                            /*#__PURE__*/ _jsxDEV(Link, {
216                                className: "btn btn-dark",
217                                to: `/${CUREENT_COMPANY_NAME}/administration/roles`,
218                                children: "Cancel"
219                            }, void 0, false, {
220                                fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
221                                lineNumber: 182,
222                                columnNumber: 29
223                            }, this)
224                        ]
225                    }, void 0, true, {
226                        fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
227                        lineNumber: 180,
228                        columnNumber: 25
229                    }, this)
230                ]
231            }, void 0, true, {
232                fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
233                lineNumber: 151,
234                columnNumber: 21
235            }, this) : /*#__PURE__*/ _jsxDEV("p", {
236                children: "No Permissions assigned to this role."
237            }, void 0, false, {
238                fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
239                lineNumber: 188,
240                columnNumber: 21
241            }, this)
242        }, void 0, false, {
243            fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
244            lineNumber: 149,
245            columnNumber: 13
246        }, this)
247    }, void 0, false, {
248        fileName: "/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx",
249        lineNumber: 148,
250        columnNumber: 9
251    }, this);
252}
253_s(EditRolePermissions, "qnxw/xgGFs3vf+ppRC215VXHdic=", false, function() {
254    return [
255        useAxiosInterceptor,
256        useLocation,
257        useNavigate
258    ];
259});
260_c = EditRolePermissions;
261var _c;
262$RefreshReg$(_c, "EditRolePermissions");
263
264
265window.$RefreshReg$ = prevRefreshReg;
266window.$RefreshSig$ = prevRefreshSig;
267
268RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => {
269  RefreshRuntime.registerExportsForReactRefresh("/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", currentExports);
270  import.meta.hot.accept((nextExports) => {
271    if (!nextExports) return;
272    const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate("/data/sixsigma/six-sigma-ui/src/app/pages/roles/rolePermissions.tsx", currentExports, nextExports);
273    if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage);
274  });
275});
276
277//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJvbGVQZXJtaXNzaW9ucy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBMaW5rLCB1c2VMb2NhdGlvbiwgdXNlTmF2aWdhdGUgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyAgQ1VSRUVOVF9DT01QQU5ZX05BTUUsIEdFVF9QRVJNSVNTSU9OU19CWV9ST0xFX0lELCBQT1NUX1JPTEVfUEVSTUlTU0lPTlNfQllfUk9MRV9JRCB9IGZyb20gJy4uLy4uL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBUZXh0RmllbGQgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IENvbnRlbnQgfSBmcm9tICcuLi8uLi8uLi9jb25maWcvbGF5b3V0L2NvbXBvbmVudHMvQ29udGVudCc7XG5pbXBvcnQgXCIuL2Nzcy9yb2xlUGVybWlzc2lvbnMuc2Nzc1wiO1xuaW1wb3J0IHsgZGlzYWJsZVNwbGFzaFNjcmVlbiwgZW5hYmxlU3BsYXNoU2NyZWVuIH0gZnJvbSAnLi4vY29tbW9uL0NvbW1vblV0aWxpdGllcyc7XG5pbXBvcnQgeyB1c2VBeGlvc0ludGVyY2VwdG9yIH0gZnJvbSAnLi4vLi4vdXNlQXhpb3NJbnRlcmNlcHRvcic7XG5cblxuXG50eXBlIFBlcm1pc3Npb25EZXRhaWxzRFRPID0ge1xuICAgIGlkOiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlzU2VsZWN0ZWQ6IGJvb2xlYW47XG4gICAgdXVpZDogc3RyaW5nOyAvLyBBc3N1bWluZyB5b3UgaGF2ZSBhIFVVSUQgZmllbGQgaW4geW91ciBwZXJtaXNzaW9uIGRldGFpbHNcbn07XG5cbnR5cGUgUm9sZURldGFpbHNEVE8gPSB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIHV1aWQ6IHN0cmluZztcbiAgICBwZXJtaXNzaW9uRGV0YWlsc0RUTzogUGVybWlzc2lvbkRldGFpbHNEVE9bXTtcbiAgICBhZGRQZXJtaXNzaW9uczpbXTtcbiAgICByZW1vdmVQZXJtaXNzaW9uczpbXTtcbn07XG5cblxuZXhwb3J0IGZ1bmN0aW9uIEVkaXRSb2xlUGVybWlzc2lvbnMoKSB7XG4gICAgdXNlQXhpb3NJbnRlcmNlcHRvcigpO1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKTtcbiAgICBsZXQgcm9sZUlkID0gcXVlcnlQYXJhbXMuZ2V0KCdyb2xlSWQnKTtcblxuICAgIC8vIFN0YXRlIHRvIGhvbGQgcm9sZSBkZXRhaWxzXG4gICAgY29uc3QgW3JvbGVEZXRhaWxzLCBzZXRSb2xlRGV0YWlsc10gPSB1c2VTdGF0ZTxSb2xlRGV0YWlsc0RUTyB8IG51bGw+KG51bGwpO1xuICAgIGNvbnN0IFtvcmlnaW5hbFBlcm1pc3Npb25zLCBzZXRPcmlnaW5hbFBlcm1pc3Npb25zXSA9IHVzZVN0YXRlPFBlcm1pc3Npb25EZXRhaWxzRFRPW10+KFtdKTtcbiAgICBjb25zdCBbcmVtb3ZlZFBlcm1pc3Npb25zLCBzZXRSZW1vdmVkUGVybWlzc2lvbnNdID0gdXNlU3RhdGU8c3RyaW5nW10+KFtdKTsgLy8gU3RvcmUgVVVJRHMgb2YgcmVtb3ZlZCBwZXJtaXNzaW9uc1xuICAgIGNvbnN0IFthZGRlZFBlcm1pc3Npb25zLCBzZXRBZGRlZFBlcm1pc3Npb25zXSA9IHVzZVN0YXRlPHN0cmluZ1tdPihbXSk7XG4gICAgXG5cbiAgICBjb25zdCAgbmF2aWdhdGU9dXNlTmF2aWdhdGUoKTtcblxuICAgIFxuICAgIFxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZldGNoUm9sZURldGFpbHMgPSBhc3luYyAocm9sZUlkOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJvbGVJZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJyb2xlSWQgaXMgbnVsbC5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlbmFibGVTcGxhc2hTY3JlZW4oKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBHRVRfUEVSTUlTU0lPTlNfQllfUk9MRV9JRChDVVJFRU5UX0NPTVBBTllfTkFNRSkucmVwbGFjZSgne3JvbGVJZH0nLCByb2xlSWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MuZ2V0KHVybCk7XG4gICAgICAgICAgICAgICAgc2V0Um9sZURldGFpbHMocmVzcG9uc2UuZGF0YSk7IC8vIFNldCB0aGUgZmV0Y2hlZCBkYXRhIHRvIHN0YXRlICAgICAgICAgICAgICAgXG4gICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBvcmlnaW5hbCBwZXJtaXNzaW9ucyB0byBvbmx5IHRob3NlIHRoYXQgYXJlIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRQZXJtaXNzaW9ucyA9IHJlc3BvbnNlLmRhdGEucGVybWlzc2lvbkRldGFpbHNEVE8uZmlsdGVyKChkdG86IF
277Blcm1pc3Npb25EZXRhaWxzRFRPKSA9PiBkdG8uaXNTZWxlY3RlZCk7XG4gICAgICAgICAgICAgICAgc2V0T3JpZ2luYWxQZXJtaXNzaW9ucyhzZWxlY3RlZFBlcm1pc3Npb25zKTsgLy8gU2V0IG9yaWdpbmFsIHBlcm1pc3Npb25zXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyByb2xlIGRldGFpbHM6XCIsIGVycm9yKTsgICBcbiAgICAgICAgICAgIH0gZmluYWxseXtcbiAgICAgICAgICAgICAgICBkaXNhYmxlU3BsYXNoU2NyZWVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZmV0Y2hSb2xlRGV0YWlscyhyb2xlSWQpO1xuICAgIH0sIFtyb2xlSWRdKTsgLy8gRGVwZW5kZW5jeSBhcnJheSB0byByZS1ydW4gZWZmZWN0IGlmIHJvbGVJZCBjaGFuZ2VzXG5cbiAgICAvLyBIYW5kbGUgY2hhbmdlIGZvciB0aGUgcm9sZSBuYW1lXG4gICAgY29uc3QgaGFuZGxlUm9sZU5hbWVDaGFuZ2UgPSAobmV3TmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChyb2xlRGV0YWlscykge1xuICAgICAgICAgICAgc2V0Um9sZURldGFpbHMoeyAuLi5yb2xlRGV0YWlscywgbmFtZTogbmV3TmFtZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgXG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZUNoZWNrYm94Q2hhbmdlID0gKGlkOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHJvbGVEZXRhaWxzKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkUGVybWlzc2lvbnMgPSByb2xlRGV0YWlscy5wZXJtaXNzaW9uRGV0YWlsc0RUTy5tYXAoKGR0bykgPT5cbiAgICAgICAgICAgICAgICBkdG8uaWQgPT09IGlkID8geyAuLi5kdG8sIGlzU2VsZWN0ZWQ6ICFkdG8uaXNTZWxlY3RlZCB9IDogZHRvXG4gICAgICAgICAgICApO1xuICAgIFxuICAgICAgICAgICAgc2V0Um9sZURldGFpbHMoeyAuLi5yb2xlRGV0YWlscywgcGVybWlzc2lvbkRldGFpbHNEVE86IHVwZGF0ZWRQZXJtaXNzaW9ucyB9KTtcbiAgICBcbiAgICAgICAgICAgIGNvbnN0IHBlcm1pc3Npb24gPSB1cGRhdGVkUGVybWlzc2lvbnMuZmluZChkdG8gPT4gZHRvLmlkID09PSBpZCk7XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbikge1xuICAgICAgICAgICAgICAgIGlmICghcGVybWlzc2lvbi5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwZXJtaXNzaW9uIGlzIGJlaW5nIHVuY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFBlcm1pc3Npb24gPSBvcmlnaW5hbFBlcm1pc3Npb25zLmZpbmQob3JpZ2luYWwgPT4gb3JpZ2luYWwuaWQgPT09IHBlcm1pc3Npb24uaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxQZXJtaXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBleGlzdHMgaW4gb3JpZ2luYWxQZXJtaXNzaW9ucywgYWRkIGl0IHRvIHJlbW92ZWRQZXJtaXNzaW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVtb3ZlZFBlcm1pc3Npb25zKHByZXYgPT4gWy4uLnByZXYsIG9yaWdpbmFsUGVybWlzc2lvbi51dWlkXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGVybWlzc2lvbiBpcyBiZWluZyBjaGVja2VkXG4gICAgICAgICAgICAgICAgICAgIHNldFJlbW92ZWRQZXJtaXNzaW9ucyhwcmV2ID0+IHByZXYuZmlsdGVyKHV1aWQgPT4gdXVpZCAhPT0gcGVybWlzc2lvbi51dWlkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGFkZGVkIHBlcm1pc3Npb25zXG4gICAgICAgICAgICAgY29uc3QgYWRkZWRQZXJtaXNzaW9ucyA9IHVwZGF0ZWRQZXJtaXNzaW9ucy5maWx0ZXIodXBkYXRlZCA9PiB1cGRhdGVkLmlzU2VsZWN0ZWQgJiYgIW9yaWdpbmFsUGVybWlzc2lvbnMuc29tZShvcmlnaW5hbCA9PiBvcmlnaW5hbC5pZCA9PT0gdXBkYXRlZC5pZCkpO1xuICAgICAgICAgICAgIHNldEFkZGVkUGVybWlzc2lvbnMoYWRkZWRQZXJtaXNzaW9ucy5tYXAocCA9PiBwLnV1aWQpKTsgICBcbiAgICAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgIFxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVTYXZlID0gYXN5bmMgKCkgPT4geyAgICAgICAgXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImFkZGVkIFBlcm1pc3Npb25zIGFyZSBcIithZGRlZFBlcm1pc3Npb25zKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmVtb3ZlZCBQZXJtaXNzaW9ucyBhcmUgXCIrcmVtb3ZlZFBlcm1pc3Npb25zKTtcbiAgICAgICAgICAgIGlmICghcm9sZUlkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcInJvbGVJZCBpcyBudWxsLlwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlU3BsYXNoU2NyZWVuKCk7XG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IFBPU1RfUk9MRV9QRVJNSVNTSU9OU19CWV9ST0xFX0lEKENVUkVFTlRfQ09NUEFOWV9OQU1FKS5yZXBsYWNlKCd7cm9sZUlkfScsIHJvbGVJZCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJVcGRhdGVkIHJvbGVBcGlVcmw6IFwiLCB1cmwpOyAgIFxuICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgb2JqZWN0IHRvIHNlbmRcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhVG9TZW5kID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5yb2xlRGV0YWlscywgLy8gU3ByZWFkIHRoZSByb2xlRGV0YWlscyBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgYWRkUGVybWlzc2lvbnM6IGFkZGVkUGVybWlzc2lvbnMsIC8vIEFkZCB0aGUgYWRkZWRQZXJtaXNzaW9uc1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVQZXJtaXNzaW9uczogcmVtb3ZlZFBlcm1pc3Npb25zIC8vIEFkZCB0aGUgcmVtb3ZlZFBlcm1pc3Npb25zXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QodXJsLCBkYXRhVG9TZW5kKTtcblxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUmVzcG9uc2U6XCIsIHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJwZXJtaXNzaW9ucyB1cGRhdGVkXCIpO1xuICAgICAgICAgICAgICAgIG5hdmlnYXRlKGAvJHtDVVJFRU5UX0NPTVBBTllfTkFNRX0vYWRtaW5pc3RyYXRpb24vcm9sZXM/cm9sZT0ke3JvbGVEZXRhaWxzPy5uYW1lfWApO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igc2F2aW5nIHBlcm1pc3Npb25zOlwiLCBlcnJvcik7XG4gICAgICAgICAgICB9ZmluYWxseXtcbiAgICAgICAgICAgICAgICBkaXNhYmxlU3BsYXNoU2NyZWVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIFxuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8Q29udGVudD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyLWZsdWlkIHJvbGUtcGVybWlzc2lvbnNcIj4gICAgICAgICBcbiAgICAgICAgICAgICAgICB7cm9sZURldGFpbHMgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbnRhaW5lcic+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPSdlZGl0X2hlYWRpbmcnPkVkaXQgUm9sZSBvZiB7cm9sZURldGFpbHMubmFtZSB8fCAnJ308L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb2xlX25hbWUnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eX
277BlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cm9sZURldGFpbHMubmFtZSB8fCAnJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJyb2xlbmFtZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJSb2xlIE5hbWVcIiAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBoYW5kbGVSb2xlTmFtZUNoYW5nZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3Blcm1pc3Npb25zJz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JvbGVEZXRhaWxzLnBlcm1pc3Npb25EZXRhaWxzRFRPLm1hcChkdG8gPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2R0by5pZH0gY2xhc3NOYW1lPSdwZXJtaXNzaW9uX25hbWUnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwicGVybWlzc2lvblZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdwZXJtaXNzaW9uX2NoZWNrYm94JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtkdG8uaXNTZWxlY3RlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eygpID0+IGhhbmRsZUNoZWNrYm94Q2hhbmdlKGR0by5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e2R0by5uYW1lfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdhY3Rpb24tYnRucyc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2J0biBidG4tcHJpbWFyeSBteC0zJyAgb25DbGljaz17aGFuZGxlU2F2ZX0+U2F2ZTwvZGl2PiAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPExpbmsgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kYXJrXCIgdG89e2AvJHtDVVJFRU5UX0NPTVBBTllfTkFNRX0vYWRtaW5pc3RyYXRpb24vcm9sZXNgfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgIFxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgPHA+Tm8gUGVybWlzc2lvbnMgYXNzaWduZWQgdG8gdGhpcyByb2xlLjwvcD5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvQ29udGVudD5cbiAgICApO1xufSJdLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwiTGluayIsInVzZUxvY2F0aW9uIiwidXNlTmF2aWdhdGUiLCJheGlvcyIsIkNVUkVFTlRfQ09NUEFOWV9OQU1FIiwiR0VUX1BFUk1JU1NJT05TX0JZX1JPTEVfSUQiLCJQT1NUX1JPTEVfUEVSTUlTU0lPTlNfQllfUk9MRV9JRCIsIlRleHRGaWVsZCIsIkNvbnRlbnQiLCJkaXNhYmxlU3BsYXNoU2NyZWVuIiwiZW5hYmxlU3BsYXNoU2NyZWVuIiwidXNlQXhpb3NJbnRlcmNlcHRvciIsIkVkaXRSb2xlUGVybWlzc2lvbnMiLCJsb2NhdGlvbiIsInF1ZXJ5UGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwic2VhcmNoIiwicm9sZUlkIiwiZ2V0Iiwicm9sZURldGFpbHMiLCJzZXRSb2xlRGV0YWlscyIsIm9yaWdpbmFsUGVybWlzc2lvbnMiLCJzZXRPcmlnaW5hbFBlcm1pc3Npb25zIiwicmVtb3ZlZFBlcm1pc3Npb25zIiwic2V0UmVtb3ZlZFBlcm1pc3Npb25zIiwiYWRkZWRQZXJtaXNzaW9ucyIsInNldEFkZGVkUGVybWlzc2lvbnMiLCJuYXZpZ2F0ZSIsImZldGNoUm9sZURldGFpbHMiLCJjb25zb2xlIiwiZXJyb3IiLCJ1cmwiLCJyZXBsYWNlIiwicmVzcG9uc2UiLCJkYXRhIiwic2VsZWN0ZWRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25EZXRhaWxzRFRPIiwiZmlsdGVyIiwiZHRvIiwiaXNTZWxlY3RlZCIsImhhbmRsZVJvbGVOYW1lQ2hhbmdlIiwibmV3TmFtZSIsIm5hbWUiLCJoYW5kbGVDaGVja2JveENoYW5nZSIsImlkIiwidXBkYXRlZFBlcm1pc3Npb25zIiwibWFwIiwicGVybWlzc2lvbiIsImZpbmQiLCJvcmlnaW5hbFBlcm1pc3Npb24iLCJvcmlnaW5hbCIsInByZXYiLCJ1dWlkIiwidXBkYXRlZCIsInNvbWUiLCJwIiwiaGFuZGxlU2F2ZSIsImxvZyIsImRhdGFUb1NlbmQiLCJhZGRQZXJtaXNzaW9ucyIsInJlbW92ZVBlcm1pc3Npb25zIiwicG9zdCIsInN0YXR1cyIsImRpdiIsImNsYXNzTmFtZSIsImZvcm0iLCJoMyIsInR5cGUiLCJ2YWx1ZSIsImxhYmVsIiwib25DaGFuZ2UiLCJlIiwidGFyZ2V0IiwiaW5wdXQiLCJjaGVja2VkIiwib25DbGljayIsInRvIl0sInJhbmdlTWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsT0FBT0EsU0FBU0MsU0FBUyxFQUFFQyxRQUFRLFFBQVEsUUFBUTtBQUNuRCxTQUFTQyxJQUFJLEVBQUVDLFdBQVcsRUFBRUMsV0FBVyxRQUFRLG1CQUFtQjtBQUNsRSxPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBVUMsb0JBQW9CLEVBQUVDLDBCQUEwQixFQUFFQyxnQ0FBZ0MsUUFBUSxrQkFBa0I7QUFDdEgsU0FBU0MsU0FBUyxRQUFRLGdCQUFnQjtBQUMxQyxTQUFTQyxPQUFPLFFBQVEsNENBQTRDO0FBQ3BFLE9BQU8sNkJBQTZCO0FBQ3BDLFNBQVNDLG1CQUFtQixFQUFFQyxrQkFBa0IsUUFBUSw0QkFBNEI7QU
277FDcEYsU0FBU0MsbUJBQW1CLFFBQVEsNEJBQTRCO0FBcUJoRSxPQUFPLFNBQVNDOztJQUNaRDtJQUNBLE1BQU1FLFdBQVdaO0lBQ2pCLE1BQU1hLGNBQWMsSUFBSUMsZ0JBQWdCRixTQUFTRyxNQUFNO0lBQ3ZELElBQUlDLFNBQVNILFlBQVlJLEdBQUcsQ0FBQztJQUU3Qiw2QkFBNkI7SUFDN0IsTUFBTSxDQUFDQyxhQUFhQyxlQUFlLEdBQUdyQixTQUFnQztJQUN0RSxNQUFNLENBQUNzQixxQkFBcUJDLHVCQUF1QixHQUFHdkIsU0FBaUMsRUFBRTtJQUN6RixNQUFNLENBQUN3QixvQkFBb0JDLHNCQUFzQixHQUFHekIsU0FBbUIsRUFBRSxHQUFHLHFDQUFxQztJQUNqSCxNQUFNLENBQUMwQixrQkFBa0JDLG9CQUFvQixHQUFHM0IsU0FBbUIsRUFBRTtJQUdyRSxNQUFPNEIsV0FBU3pCO0lBSWhCSixVQUFVO1FBQ04sTUFBTThCLG1CQUFtQixPQUFPWDtZQUM1QixJQUFJLENBQUNBLFFBQVE7Z0JBQ1RZLFFBQVFDLEtBQUssQ0FBQztnQkFDZDtZQUNKO1lBQ0EsSUFBSTtnQkFDQXBCO2dCQUNBLE1BQU1xQixNQUFNMUIsMkJBQTJCRCxzQkFBc0I0QixPQUFPLENBQUMsWUFBWWY7Z0JBQ2pGLE1BQU1nQixXQUFXLE1BQU05QixNQUFNZSxHQUFHLENBQUNhO2dCQUNqQ1gsZUFBZWEsU0FBU0MsSUFBSSxHQUFHLCtDQUErQztnQkFFOUUsMkRBQTJEO2dCQUMzRCxNQUFNQyxzQkFBc0JGLFNBQVNDLElBQUksQ0FBQ0Usb0JBQW9CLENBQUNDLE1BQU0sQ0FBQyxDQUFDQyxNQUE4QkEsSUFBSUMsVUFBVTtnQkFDbkhqQix1QkFBdUJhLHNCQUFzQiwyQkFBMkI7WUFDNUUsRUFBRSxPQUFPTCxPQUFPO2dCQUNaRCxRQUFRQyxLQUFLLENBQUMsZ0NBQWdDQTtZQUNsRCxTQUFTO2dCQUNMckI7WUFDSjtRQUNKO1FBRUFtQixpQkFBaUJYO0lBQ3JCLEdBQUc7UUFBQ0E7S0FBTyxHQUFHLHNEQUFzRDtJQUVwRSx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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.