{ "version": 3, "sources": ["../ui/app/mn_admin/mn_user_roles_service.js"], "sourcesContent": ["/*\nCopyright 2020-Present Couchbase, Inc.\n\nUse of this software is governed by the Business Source License included in\nthe file licenses/BSL-Couchbase.txt. As of the Change Date specified in that\nfile, in accordance with the Business Source License, use of this software will\nbe governed by the Apache License, Version 2.0, included in the file\nlicenses/APL2.txt.\n*/\n\nimport angular from \"angular\";\n\nimport mnPoolDefault from \"../components/mn_pool_default.js\";\nimport mnStoreService from \"../components/mn_store_service.js\";\nimport mnStatisticsNewService from \"./mn_statistics_service.js\";\nimport mnStatsDesc from \"./mn_statistics_description.js\";\n\nexport default \"mnUserRolesService\";\n\nangular\n .module(\"mnUserRolesService\", [mnPoolDefault, mnStoreService, mnStatisticsNewService])\n .factory(\"mnUserRolesService\", [\"$q\", \"$http\", \"mnPoolDefault\", \"mnStoreService\", \"mnStatisticsNewService\", mnUserRolesFactory]);\n\nfunction mnUserRolesFactory($q, $http, mnPoolDefault, mnStoreService, mnStatisticsNewService) {\n var mnUserRolesService = {\n getState: getState,\n addUser: addUser,\n deleteUser: deleteUser,\n getRoles: getRoles,\n getUsers: getUsers,\n getUser: getUser,\n lookupLDAPUser: lookupLDAPUser,\n\n addGroup: addGroup,\n deleteRolesGroup: deleteRolesGroup,\n getRolesGroups: getRolesGroups,\n getRolesGroup: getRolesGroup,\n putRolesGroup: putRolesGroup,\n getRolesGroupsState: getRolesGroupsState,\n\n ldapConnectivityValidate: ldapConnectivityValidate,\n ldapAuthenticationValidate: ldapAuthenticationValidate,\n ldapGroupsQueryValidate: ldapGroupsQueryValidate,\n\n postLdapSettings: postLdapSettings,\n getLdapSettings: getLdapSettings,\n getSamlSettings: getSamlSettings,\n clearLdapCache: clearLdapCache,\n\n getUserProfile: getUserProfile,\n putUserProfile: putUserProfile,\n\n saveDashboard: saveDashboard,\n resetDashboard: resetDashboard,\n getSaslauthdAuth: getSaslauthdAuth,\n packRolesToSend: packRolesToSend,\n getRoleParams: getRoleParams,\n packRoleParams: packRoleParams\n };\n\n var clientTLSCert = \"Client Cert should be supplied\";\n var queryDnError = \"LDAP DN should be supplied\";\n var usersAttrsError = \"The field can't be empty\";\n\n return mnUserRolesService;\n\n function getSaslauthdAuth() {\n return $http({\n method: \"GET\",\n url: \"/settings/saslauthdAuth\"\n }).then(function (resp) {\n return resp.data;\n }, function () {\n return;\n });\n }\n\n function clearLdapCache() {\n return $http({\n method: \"POST\",\n url: \"/settings/invalidateLDAPCache\"\n });\n }\n\n function getLdapSettings() {\n return $http({\n method: \"GET\",\n url: \"/settings/ldap\"\n });\n }\n\n function getSamlSettings() {\n return $http({\n method: \"GET\",\n url: \"/settings/saml\"\n });\n }\n\n function validateLDAPQuery(data) {\n return !!(data.userDNMapping && typeof data.userDNMapping === 'string' && data.userDNMapping.includes(\"query\"));\n }\n\n function validateGroupQuery(data) {\n return !!(data.groupsQuery);\n }\n\n function validateGroupUserAttrs(formData) {\n return formData.queryForGroups === \"users_attrs\" &&\n !formData.group.groupsQuery.attributes;\n }\n\n function validateAuthType(errors, data, formData) {\n if ((formData.authType == \"creds\") && !data.bindDN) {\n errors.bindDN = queryDnError;\n }\n if ((formData.authType == \"cert\") && !data.clientTLSCert) {\n errors.clientTLSCert = clientTLSCert;\n }\n }\n\n function ldapConnectivityValidate(data, formData) {\n var errors = {};\n validateAuthType(errors, data, formData);\n if (Object.keys(errors).length) {\n return $q.reject(errors);\n } else {\n return $http.post(\"/settings/ldap/validate/connectivity\", data);\n }\n }\n\n function ldapAuthenticationValidate(data, formData) {\n var errors = {};\n if (validateLDAPQuery(data)) {\n validateAuthType(errors, data, formData);\n }\n if (Object.keys(errors).length) {\n return $q.reject(errors);\n } else {\n return $http.post(\"/settings/ldap/validate/authentication\", data);\n }\n }\n\n function ldapGroupsQueryValidate(data, formData) {\n var errors = {};\n if (validateGroupQuery(data)) {\n validateAuthType(errors, data, formData);\n }\n if (validateGroupUserAttrs(formData)) {\n errors.groupsQuery = usersAttrsError;\n }\n if (!data.groupsQueryUser) {\n errors.groupsQueryUser = \"The filed is mandatory\";\n }\n if (Object.keys(errors).length) {\n return $q.reject(errors);\n } else {\n return $http.post(\"/settings/ldap/validate/groupsQuery\", data);\n }\n }\n\n function getRoleParams(rolesByRole, role) {\n if (!rolesByRole || !rolesByRole[role.role]) {\n return;\n }\n return rolesByRole[role.role].params.map(param => role[param] || \"*\").join(\":\");\n }\n\n function packRoleParams(params) {\n let i;\n let rv = [];\n for (i = 0; i < params.length; i++) {\n let val = params[i];\n if (val == \"*\") {\n if (i == 0) {\n rv.push(\"*\");\n }\n break;\n } else {\n rv.push(val);\n }\n }\n return rv.join(\":\");\n }\n\n function packRolesToSend(selectedRoles, selectedRolesConfigs) {\n return Object\n .keys(selectedRoles)\n .filter(role => selectedRoles[role])\n .concat(Object\n .keys(selectedRolesConfigs)\n .reduce((acc, role) =>\n acc.concat((selectedRolesConfigs[role] || [])\n .map(config =>\n (role + \"[\" + packRoleParams(config.split(\":\")) + \"]\"))), []));\n }\n\n\n function postLdapSettings(data, formData) {\n var errors = {};\n var isGroups = data.authorizationEnabled;\n var isUser = data.authenticationEnabled;\n if ((!isUser && !isGroups) || (validateLDAPQuery(data) && isUser) ||\n (validateGroupQuery(data) && isGroups)) {\n validateAuthType(errors, data, formData);\n }\n if (isGroups && validateGroupUserAttrs(formData)) {\n errors.groupsQuery = usersAttrsError;\n }\n if (formData.connect.encryption !== \"None\" &&\n formData.connect.serverCertValidation == \"pasteCert\" &&\n !formData.connect.cacert) {\n errors.cacert = \"The certificate should be provided\"\n }\n if (Object.keys(errors).length) {\n return $q.reject(errors);\n } else {\n return $http({\n method: \"POST\",\n url: \"/settings/ldap\",\n data: data\n });\n }\n }\n\n function saveDashboard() {\n return getProfile().then(function (resp) {\n var profile = resp.data;\n profile.scenarios = mnStoreService.store(\"scenarios\").share();\n profile.groups = mnStoreService.store(\"groups\").share();\n profile.charts = mnStoreService.store(\"charts\").share();\n return putUserProfile(profile);\n });\n }\n\n function resetDashboard() {\n return getProfile().then(function (resp) {\n var profile = resp.data;\n mnStoreService.store(\"charts\").clear();\n mnStoreService.store(\"groups\").clear();\n mnStoreService.store(\"scenarios\").clear();\n\n mnStatisticsNewService.doAddPresetScenario();\n\n profile.scenarios = mnStoreService.store(\"scenarios\").share();\n profile.groups = mnStoreService.store(\"groups\").share();\n profile.charts = mnStoreService.store(\"charts\").share();\n\n\n if (mnPoolDefault.export.compat.atLeast70) {\n upgradeChartsNamesTo70(profile);\n }\n\n return putUserProfile(profile);\n });\n }\n\n function putUserProfile(data) {\n return $http.put(\"/settings/rbac/profiles/@self\", JSON.stringify(data));\n }\n\n function getProfile() {\n return $http.get(\"/settings/rbac/profiles/@self\").then(null, function (resp) {\n switch (resp.status) {\n case 404:\n resp.data = {};\n return resp;\n default:\n return $q.reject();\n }\n });\n }\n\n function upgradeChartsNamesTo76(profile) {\n profile.charts = profile.charts.map(chart => {\n chart.stats = Object.keys(chart.stats)\n .reduce((acc, stat71) => {\n acc[mnStatsDesc.upgrade71to76(stat71)] = true;\n return acc;\n }, {});\n return chart;\n });\n }\n\n function upgradeChartsNamesTo71(profile) {\n profile.charts = profile.charts.map(chart => {\n chart.stats = Object.keys(chart.stats)\n .reduce((acc, stat70) => {\n acc[mnStatsDesc.upgrade70to71(stat70)] = true;\n return acc;\n }, {});\n return chart;\n });\n }\n\n function upgradeChartsNamesTo70(profile) {\n profile.charts = profile.charts.map(chart => {\n chart.stats = Object.keys(chart.stats)\n .reduce((acc, stat65) => {\n acc[mnStatsDesc.mapping65(stat65)] = true;\n return acc;\n }, {});\n return chart;\n });\n }\n\n function remove65PresetScenarios(profile) {\n profile.scenarios = profile.scenarios.filter(v => !v.preset);\n profile.groups = profile.groups.filter(v => !v.preset);\n profile.charts = profile.charts.filter(v => !v.preset);\n }\n\n function concatPresetAndUsersScenarios(profile) {\n profile.scenarios = profile.scenarios.concat(mnStoreService.store(\"scenarios\").share());\n profile.groups = profile.groups.concat(mnStoreService.store(\"groups\").share());\n profile.charts = profile.charts.concat(mnStoreService.store(\"charts\").share());\n }\n\n function createPresetScenarios() {\n mnStoreService.createStore(\"scenarios\", {keyPath: \"id\"});\n mnStoreService.createStore(\"groups\", {keyPath: \"id\"});\n mnStoreService.createStore(\"charts\", {keyPath: \"id\"});\n mnStatisticsNewService.doAddPresetScenario();\n }\n\n function getUserProfile() {\n return $q.all([\n getProfile(),\n mnPoolDefault.get()\n ]).then(function (resp) {\n var profile = resp[0].data;\n var poolDefault = resp[1];\n if (profile.version) {\n if (poolDefault.compat.atLeast70 && (profile.version < poolDefault.versions[\"70\"])) {\n //remove old preset scenarios\n remove65PresetScenarios(profile);\n //generate new preset scenarios\n createPresetScenarios();\n //concat new preset scenarios and users custom scenarios\n concatPresetAndUsersScenarios(profile);\n //upgrade user/preset stat names to 70\n upgradeChartsNamesTo70(profile);\n return putUserProfile({\n version: poolDefault.versions[\"70\"],\n scenarios: profile.scenarios,\n groups: profile.groups,\n charts: profile.charts\n }).then(getUserProfile);\n }\n if (poolDefault.compat.atLeast71 && (profile.version < poolDefault.versions[\"71\"])) {\n upgradeChartsNamesTo71(profile);\n return putUserProfile({\n version: poolDefault.versions[\"71\"],\n scenarios: profile.scenarios,\n groups: profile.groups,\n charts: profile.charts\n }).then(getUserProfile);\n }\n if (poolDefault.compat.atLeast76 && (profile.version < poolDefault.versions[\"76\"])) {\n upgradeChartsNamesTo76(profile);\n return putUserProfile({\n version: poolDefault.versions[\"76\"],\n scenarios: profile.scenarios,\n groups: profile.groups,\n charts: profile.charts\n }).then(getUserProfile);\n }\n mnStoreService.createStore(\"scenarios\", {keyPath: \"id\", fill: profile.scenarios});\n mnStoreService.createStore(\"groups\", {keyPath: \"id\", fill: profile.groups});\n mnStoreService.createStore(\"charts\", {keyPath: \"id\", fill: profile.charts});\n return profile;\n } else {\n //inititlize user profile\n createPresetScenarios();\n\n return putUserProfile({\n version: poolDefault.versions[\"65\"],\n scenarios: mnStoreService.store(\"scenarios\").share(),\n groups: mnStoreService.store(\"groups\").share(),\n charts: mnStoreService.store(\"charts\").share()\n }).then(getUserProfile);\n }\n });\n }\n\n\n function getRoles() {\n return $http({\n method: \"GET\",\n url: \"/_uiroles\"\n }).then(function (resp) {\n let rv = resp.data;\n rv.rolesByRole = rv.folders.reduce((acc, group) => {\n group.roles.forEach(role => acc[role.role] = role);\n return acc;\n }, {});\n return rv;\n });\n }\n\n function getUser(user, params) {\n return $http({\n method: \"GET\",\n url: getUserUrl(user),\n params: params\n });\n }\n\n function lookupLDAPUser(user) {\n return $http({\n method: \"GET\",\n url: getLookupLDAPUserUrl(user)\n })\n }\n\n function getUsers(params) {\n var config = {\n method: \"GET\",\n url: \"/settings/rbac/users\"\n };\n\n config.params = {};\n if (params && params.permission) {\n config.params.permission = params.permission;\n }\n if (params && params.pageSize) {\n if (params.substr) {\n config.params.substr = params.substr;\n }\n config.params.pageSize = params.pageSize;\n config.params.startFromDomain = params.startFromDomain;\n config.params.startFrom = params.startFrom;\n config.params.order = params.order;\n config.params.sortBy = params.sortBy;\n }\n\n return $http(config);\n }\n\n function deleteUser(user) {\n return $http({\n method: \"DELETE\",\n url: getUserUrl(user)\n });\n }\n\n function deleteRolesGroup(group) {\n return $http({\n method: \"DELETE\",\n url: \"/settings/rbac/groups/\" + encodeURIComponent(group.id),\n });\n }\n\n function getUserUrl(user) {\n var base = \"/settings/rbac/users/\";\n return base + encodeURIComponent(user.domain) + \"/\" + encodeURIComponent(user.id);\n }\n\n function getLookupLDAPUserUrl(user) {\n return \"/settings/rbac/lookupLDAPUser/\" + encodeURIComponent(user.id);\n }\n\n function packData(user, roles, groups, isEditingMode, resetPassword) {\n var data = {\n roles: roles.indexOf(\"admin\") > -1 ? \"admin\" : roles.join(','),\n name: user.name\n };\n\n if (mnPoolDefault.export.isEnterprise) {\n data.groups = groups.join(',');\n }\n\n if ((!isEditingMode && user.domain == \"local\") || resetPassword) {\n data.password = user.password;\n }\n\n return data;\n }\n\n function doAddUser(data, user) {\n return $http({\n method: \"PUT\",\n data: data,\n url: getUserUrl(user)\n });\n }\n\n function addGroup(group, roles, isEditingMode) {\n if (!group || !group.id) {\n return $q.reject({name: \"name is required\"});\n }\n if (isEditingMode) {\n return putRolesGroup(group, roles);\n } else {\n return getRolesGroup(group).then(function () {\n return $q.reject({name: \"group already exists\"});\n }, function () {\n return putRolesGroup(group, roles);\n });\n }\n }\n\n function getRolesGroups(params) {\n var config = {\n method: \"GET\",\n url: \"/settings/rbac/groups\",\n params: {}\n };\n\n if (params && params.pageSize) {\n if (params.substr) {\n config.params.substr = params.substr;\n }\n config.params.pageSize = params.pageSize;\n config.params.startFrom = params.startFrom;\n config.params.order = params.order;\n config.params.sortBy = params.sortBy;\n }\n\n return $http(config);\n }\n\n function getRolesGroup(group) {\n return $http({\n method: \"GET\",\n url: \"/settings/rbac/groups/\" + encodeURIComponent(group.id)\n });\n }\n\n function putRolesGroup(group, roles) {\n let data = {\n roles: roles.indexOf(\"admin\") > -1 ? \"admin\" : roles.join(','),\n description: group.description\n };\n if (group.ldap_group_ref) {\n data.ldap_group_ref = group.ldap_group_ref;\n }\n var config = {\n method: \"PUT\",\n url: \"/settings/rbac/groups/\" + encodeURIComponent(group.id),\n data: data\n };\n\n return $http(config);\n }\n\n function getRolesGroupsState(params) {\n return getRolesGroups(params).then(function (resp) {\n var i;\n for (i in resp.data.links) {\n resp.data.links[i] = resp.data.links[i].split(\"?\")[1]\n .split(\"&\")\n .reduce(function(prev, curr) {\n var p = curr.split(\"=\");\n prev[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);\n return prev;\n }, {});\n }\n return resp.data;\n\n });\n }\n\n function addUser(user, roles, groups, isEditingMode, resetPassword) {\n if (!user || !user.id) {\n return $q.reject({username: \"username is required\"});\n }\n if (isEditingMode) {\n return doAddUser(packData(user, roles, groups, isEditingMode, resetPassword), user);\n } else {\n return getUser(user).then(function () {\n return $q.reject({username: \"username already exists\"});\n }, function () {\n return doAddUser(packData(user, roles, groups, isEditingMode), user);\n });\n }\n }\n\n function getState(params) {\n return getUsers(params).then(function (resp) {\n var i;\n for (i in resp.data.links) {\n resp.data.links[i] = resp.data.links[i].split(\"?\")[1]\n .split(\"&\")\n .reduce(function(prev, curr) {\n var p = curr.split(\"=\");\n prev[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);\n return prev;\n }, {});\n }\n if (!resp.data.users) {//in oreder to support compatibility mode\n return {\n users: resp.data\n };\n } else {\n return resp.data;\n }\n });\n }\n}\n"], "mappings": "uSAiBA,GAAO,+BAAQ,qBAEf,UACG,OAAO,qBAAsB,CAAC,wBAAe,yBAAgB,gCAC7D,QAAQ,qBAAsB,CAAC,KAAM,QAAS,gBAAiB,iBAAkB,yBAA0B,qBAE9G,4BAA4B,GAAI,MAAO,cAAe,eAAgB,uBAAwB,CAC5F,GAAI,oBAAqB,CACvB,SACA,QACA,WACA,SACA,SACA,QACA,eAEA,SACA,iBACA,eACA,cACA,cACA,oBAEA,yBACA,2BACA,wBAEA,iBACA,gBACA,gBACA,eAEA,eACA,eAEA,cACA,eACA,iBACA,gBACA,cACA,gBAGE,cAAgB,iCAChB,aAAe,6BACf,gBAAkB,2BAEtB,MAAO,oBAEP,2BAA4B,CAC1B,MAAO,OAAM,CACX,OAAQ,MACR,IAAK,4BACJ,KAAK,SAAU,KAAM,CACtB,MAAO,MAAK,MACX,UAAY,IAKjB,yBAA0B,CACxB,MAAO,OAAM,CACX,OAAQ,OACR,IAAK,kCAIT,0BAA2B,CACzB,MAAO,OAAM,CACX,OAAQ,MACR,IAAK,mBAIT,0BAA2B,CACzB,MAAO,OAAM,CACX,OAAQ,MACR,IAAK,mBAIT,2BAA2B,KAAM,CAC/B,MAAO,CAAC,CAAE,MAAK,eAAiB,MAAO,MAAK,eAAkB,UAAY,KAAK,cAAc,SAAS,UAGxG,4BAA4B,KAAM,CAChC,MAAO,CAAC,CAAE,KAAK,YAGjB,gCAAgC,SAAU,CACxC,MAAO,UAAS,iBAAmB,eACjC,CAAC,SAAS,MAAM,YAAY,WAGhC,0BAA0B,OAAQ,KAAM,SAAU,CAChD,AAAK,SAAS,UAAY,SAAY,CAAC,KAAK,QAC1C,QAAO,OAAS,cAEb,SAAS,UAAY,QAAW,CAAC,KAAK,eACzC,QAAO,cAAgB,eAI3B,kCAAkC,KAAM,SAAU,CAChD,GAAI,QAAS,GAEb,MADA,kBAAiB,OAAQ,KAAM,UAC3B,OAAO,KAAK,QAAQ,OACf,GAAG,OAAO,QAEV,MAAM,KAAK,uCAAwC,MAI9D,oCAAoC,KAAM,SAAU,CAClD,GAAI,QAAS,GAIb,MAHI,mBAAkB,OACpB,iBAAiB,OAAQ,KAAM,UAE7B,OAAO,KAAK,QAAQ,OACf,GAAG,OAAO,QAEV,MAAM,KAAK,yCAA0C,MAIhE,iCAAiC,KAAM,SAAU,CAC/C,GAAI,QAAS,GAUb,MATI,oBAAmB,OACrB,iBAAiB,OAAQ,KAAM,UAE7B,uBAAuB,WACzB,QAAO,YAAc,iBAElB,KAAK,iBACR,QAAO,gBAAkB,0BAEvB,OAAO,KAAK,QAAQ,OACf,GAAG,OAAO,QAEV,MAAM,KAAK,sCAAuC,MAI7D,uBAAuB,YAAa,KAAM,CACxC,GAAI,GAAC,aAAe,CAAC,YAAY,KAAK,OAGtC,MAAO,aAAY,KAAK,MAAM,OAAO,IAAI,OAAS,KAAK,QAAU,KAAK,KAAK,KAG7E,wBAAwB,OAAQ,CAC9B,GAAI,GACA,GAAK,GACT,IAAK,EAAI,EAAG,EAAI,OAAO,OAAQ,IAAK,CAClC,GAAI,KAAM,OAAO,GACjB,GAAI,KAAO,IAAK,CACd,AAAI,GAAK,GACP,GAAG,KAAK,KAEV,UAEA,IAAG,KAAK,KAGZ,MAAO,IAAG,KAAK,KAGjB,yBAAyB,cAAe,qBAAsB,CAC5D,MAAO,QACJ,KAAK,eACL,OAAO,MAAQ,cAAc,OAC7B,OAAO,OACC,KAAK,sBACL,OAAO,CAAC,IAAK,OACN,IAAI,OAAQ,sBAAqB,OAAS,IAC9B,IAAI,QACC,KAAO,IAAM,eAAe,OAAO,MAAM,MAAQ,MAAQ,KAI9F,0BAA0B,KAAM,SAAU,CACxC,GAAI,QAAS,GACT,SAAW,KAAK,qBAChB,OAAS,KAAK,sBAalB,MAZK,EAAC,QAAU,CAAC,UAAc,kBAAkB,OAAS,QACrD,mBAAmB,OAAS,WAC/B,iBAAiB,OAAQ,KAAM,UAE7B,UAAY,uBAAuB,WACrC,QAAO,YAAc,iBAEnB,SAAS,QAAQ,aAAe,QAChC,SAAS,QAAQ,sBAAwB,aACzC,CAAC,SAAS,QAAQ,QACpB,QAAO,OAAS,sCAEd,OAAO,KAAK,QAAQ,OACf,GAAG,OAAO,QAEV,MAAM,CACX,OAAQ,OACR,IAAK,iBACL,OAKN,wBAAyB,CACvB,MAAO,cAAa,KAAK,SAAU,KAAM,CACvC,GAAI,SAAU,KAAK,KACnB,eAAQ,UAAY,eAAe,MAAM,aAAa,QACtD,QAAQ,OAAS,eAAe,MAAM,UAAU,QAChD,QAAQ,OAAS,eAAe,MAAM,UAAU,QACzC,eAAe,WAI1B,yBAA0B,CACxB,MAAO,cAAa,KAAK,SAAU,KAAM,CACvC,GAAI,SAAU,KAAK,KACnB,sBAAe,MAAM,UAAU,QAC/B,eAAe,MAAM,UAAU,QAC/B,eAAe,MAAM,aAAa,QAElC,uBAAuB,sBAEvB,QAAQ,UAAY,eAAe,MAAM,aAAa,QACtD,QAAQ,OAAS,eAAe,MAAM,UAAU,QAChD,QAAQ,OAAS,eAAe,MAAM,UAAU,QAG5C,cAAc,OAAO,OAAO,WAC9B,uBAAuB,SAGlB,eAAe,WAI1B,wBAAwB,KAAM,CAC5B,MAAO,OAAM,IAAI,gCAAiC,KAAK,UAAU,OAGnE,qBAAsB,CACpB,MAAO,OAAM,IAAI,iCAAiC,KAAK,KAAM,SAAU,KAAM,CAC3E,OAAQ,KAAK,YACR,KACH,YAAK,KAAO,GACL,aAEP,MAAO,IAAG,YAKhB,gCAAgC,QAAS,CACvC,QAAQ,OAAS,QAAQ,OAAO,IAAI,OAClC,OAAM,MAAQ,OAAO,KAAK,MAAM,OAC3B,OAAO,CAAC,IAAK,SACZ,KAAI,kCAAY,cAAc,SAAW,GAClC,KACN,IACA,QAIX,gCAAgC,QAAS,CACvC,QAAQ,OAAS,QAAQ,OAAO,IAAI,OAClC,OAAM,MAAQ,OAAO,KAAK,MAAM,OAC7B,OAAO,CAAC,IAAK,SACZ,KAAI,kCAAY,cAAc,SAAW,GAClC,KACN,IACE,QAIX,gCAAgC,QAAS,CACvC,QAAQ,OAAS,QAAQ,OAAO,IAAI,OAClC,OAAM,MAAQ,OAAO,KAAK,MAAM,OAC7B,OAAO,CAAC,IAAK,SACZ,KAAI,kCAAY,UAAU,SAAW,GAC9B,KACN,IACE,QAIX,iCAAiC,QAAS,CACxC,QAAQ,UAAY,QAAQ,UAAU,OAAO,GAAK,CAAC,EAAE,QACrD,QAAQ,OAAS,QAAQ,OAAO,OAAO,GAAK,CAAC,EAAE,QAC/C,QAAQ,OAAS,QAAQ,OAAO,OAAO,GAAK,CAAC,EAAE,QAGjD,uCAAuC,QAAS,CAC9C,QAAQ,UAAY,QAAQ,UAAU,OAAO,eAAe,MAAM,aAAa,SAC/E,QAAQ,OAAS,QAAQ,OAAO,OAAO,eAAe,MAAM,UAAU,SACtE,QAAQ,OAAS,QAAQ,OAAO,OAAO,eAAe,MAAM,UAAU,SAGxE,gCAAiC,CAC/B,eAAe,YAAY,YAAa,CAAC,QAAS,OAClD,eAAe,YAAY,SAAU,CAAC,QAAS,OAC/C,eAAe,YAAY,SAAU,CAAC,QAAS,OAC/C,uBAAuB,sBAGzB,yBAA0B,CACxB,MAAO,IAAG,IAAI,CACZ,aACA,cAAc,QACb,KAAK,SAAU,KAAM,CACtB,GAAI,SAAU,KAAK,GAAG,KAClB,YAAc,KAAK,GACvB,MAAI,SAAQ,QACN,YAAY,OAAO,WAAc,QAAQ,QAAU,YAAY,SAAS,MAE1E,yBAAwB,SAExB,wBAEA,8BAA8B,SAE9B,uBAAuB,SAChB,eAAe,CACpB,QAAS,YAAY,SAAS,MAC9B,UAAW,QAAQ,UACnB,OAAQ,QAAQ,OAChB,OAAQ,QAAQ,SACf,KAAK,iBAEN,YAAY,OAAO,WAAc,QAAQ,QAAU,YAAY,SAAS,MAC1E,wBAAuB,SAChB,eAAe,CACpB,QAAS,YAAY,SAAS,MAC9B,UAAW,QAAQ,UACnB,OAAQ,QAAQ,OAChB,OAAQ,QAAQ,SACf,KAAK,iBAEN,YAAY,OAAO,WAAc,QAAQ,QAAU,YAAY,SAAS,MAC1E,wBAAuB,SAChB,eAAe,CACpB,QAAS,YAAY,SAAS,MAC9B,UAAW,QAAQ,UACnB,OAAQ,QAAQ,OAChB,OAAQ,QAAQ,SACf,KAAK,iBAEV,gBAAe,YAAY,YAAa,CAAC,QAAS,KAAM,KAAM,QAAQ,YACtE,eAAe,YAAY,SAAU,CAAC,QAAS,KAAM,KAAM,QAAQ,SACnE,eAAe,YAAY,SAAU,CAAC,QAAS,KAAM,KAAM,QAAQ,SAC5D,SAGP,yBAEO,eAAe,CACpB,QAAS,YAAY,SAAS,MAC9B,UAAW,eAAe,MAAM,aAAa,QAC7C,OAAQ,eAAe,MAAM,UAAU,QACvC,OAAQ,eAAe,MAAM,UAAU,UACtC,KAAK,mBAMd,mBAAoB,CAClB,MAAO,OAAM,CACX,OAAQ,MACR,IAAK,cACJ,KAAK,SAAU,KAAM,CACtB,GAAI,IAAK,KAAK,KACd,UAAG,YAAc,GAAG,QAAQ,OAAO,CAAC,IAAK,QACvC,OAAM,MAAM,QAAQ,MAAQ,IAAI,KAAK,MAAQ,MACtC,KACN,IACI,KAIX,iBAAiB,KAAM,OAAQ,CAC7B,MAAO,OAAM,CACX,OAAQ,MACR,IAAK,WAAW,MAChB,SAIJ,wBAAwB,KAAM,CAC5B,MAAO,OAAM,CACX,OAAQ,MACR,IAAK,qBAAqB,QAI9B,kBAAkB,OAAQ,CACxB,GAAI,QAAS,CACX,OAAQ,MACR,IAAK,wBAGP,cAAO,OAAS,GACZ,QAAU,OAAO,YACnB,QAAO,OAAO,WAAa,OAAO,YAEhC,QAAU,OAAO,UACf,QAAO,QACT,QAAO,OAAO,OAAS,OAAO,QAEhC,OAAO,OAAO,SAAW,OAAO,SAChC,OAAO,OAAO,gBAAkB,OAAO,gBACvC,OAAO,OAAO,UAAY,OAAO,UACjC,OAAO,OAAO,MAAQ,OAAO,MAC7B,OAAO,OAAO,OAAS,OAAO,QAGzB,MAAM,QAGf,oBAAoB,KAAM,CACxB,MAAO,OAAM,CACX,OAAQ,SACR,IAAK,WAAW,QAIpB,0BAA0B,MAAO,CAC/B,MAAO,OAAM,CACX,OAAQ,SACR,IAAK,yBAA2B,mBAAmB,MAAM,MAI7D,oBAAoB,KAAM,CACxB,GAAI,MAAO,wBACX,MAAO,MAAO,mBAAmB,KAAK,QAAU,IAAO,mBAAmB,KAAK,IAGjF,8BAA8B,KAAM,CAClC,MAAO,iCAAmC,mBAAmB,KAAK,IAGpE,kBAAkB,KAAM,MAAO,OAAQ,cAAe,cAAe,CACnE,GAAI,MAAO,CACT,MAAO,MAAM,QAAQ,SAAW,GAAK,QAAU,MAAM,KAAK,KAC1D,KAAM,KAAK,MAGb,MAAI,eAAc,OAAO,cACvB,MAAK,OAAS,OAAO,KAAK,MAGvB,EAAC,eAAiB,KAAK,QAAU,SAAY,gBAChD,MAAK,SAAW,KAAK,UAGhB,KAGT,mBAAmB,KAAM,KAAM,CAC7B,MAAO,OAAM,CACX,OAAQ,MACR,KACA,IAAK,WAAW,QAIpB,kBAAkB,MAAO,MAAO,cAAe,CAC7C,MAAI,CAAC,OAAS,CAAC,MAAM,GACZ,GAAG,OAAO,CAAC,KAAM,qBAEtB,cACK,cAAc,MAAO,OAErB,cAAc,OAAO,KAAK,UAAY,CAC3C,MAAO,IAAG,OAAO,CAAC,KAAM,0BACvB,UAAY,CACb,MAAO,eAAc,MAAO,SAKlC,wBAAwB,OAAQ,CAC9B,GAAI,QAAS,CACX,OAAQ,MACR,IAAK,wBACL,OAAQ,IAGV,MAAI,SAAU,OAAO,UACf,QAAO,QACT,QAAO,OAAO,OAAS,OAAO,QAEhC,OAAO,OAAO,SAAW,OAAO,SAChC,OAAO,OAAO,UAAY,OAAO,UACjC,OAAO,OAAO,MAAQ,OAAO,MAC7B,OAAO,OAAO,OAAS,OAAO,QAGzB,MAAM,QAGf,uBAAuB,MAAO,CAC5B,MAAO,OAAM,CACX,OAAQ,MACR,IAAK,yBAA2B,mBAAmB,MAAM,MAI7D,uBAAuB,MAAO,MAAO,CACnC,GAAI,MAAO,CACT,MAAO,MAAM,QAAQ,SAAW,GAAK,QAAU,MAAM,KAAK,KAC1D,YAAa,MAAM,aAErB,AAAI,MAAM,gBACR,MAAK,eAAiB,MAAM,gBAE9B,GAAI,QAAS,CACX,OAAQ,MACR,IAAK,yBAA2B,mBAAmB,MAAM,IACzD,MAGF,MAAO,OAAM,QAGf,6BAA6B,OAAQ,CACnC,MAAO,gBAAe,QAAQ,KAAK,SAAU,KAAM,CACjD,GAAI,GACJ,IAAK,IAAK,MAAK,KAAK,MAClB,KAAK,KAAK,MAAM,GAAK,KAAK,KAAK,MAAM,GAAG,MAAM,KAAK,GAChD,MAAM,KACN,OAAO,SAAS,KAAM,KAAM,CAC3B,GAAI,GAAI,KAAK,MAAM,KACnB,YAAK,mBAAmB,EAAE,KAAO,mBAAmB,EAAE,IAC/C,MACN,IAEP,MAAO,MAAK,OAKhB,iBAAiB,KAAM,MAAO,OAAQ,cAAe,cAAe,CAClE,MAAI,CAAC,MAAQ,CAAC,KAAK,GACV,GAAG,OAAO,CAAC,SAAU,yBAE1B,cACK,UAAU,SAAS,KAAM,MAAO,OAAQ,cAAe,eAAgB,MAEvE,QAAQ,MAAM,KAAK,UAAY,CACpC,MAAO,IAAG,OAAO,CAAC,SAAU,6BAC3B,UAAY,CACb,MAAO,WAAU,SAAS,KAAM,MAAO,OAAQ,eAAgB,QAKrE,kBAAkB,OAAQ,CACxB,MAAO,UAAS,QAAQ,KAAK,SAAU,KAAM,CAC3C,GAAI,GACJ,IAAK,IAAK,MAAK,KAAK,MAClB,KAAK,KAAK,MAAM,GAAK,KAAK,KAAK,MAAM,GAAG,MAAM,KAAK,GAChD,MAAM,KACN,OAAO,SAAS,KAAM,KAAM,CAC3B,GAAI,GAAI,KAAK,MAAM,KACnB,YAAK,mBAAmB,EAAE,KAAO,mBAAmB,EAAE,IAC/C,MACN,IAEP,MAAK,MAAK,KAAK,MAKN,KAAK,KAJL,CACL,MAAO,KAAK,SAxjBb", "names": [] }