From 2a169cad05884ced6101cf83691384a286bbadac Mon Sep 17 00:00:00 2001 From: Douglas DUTEIL Date: Thu, 14 Dec 2023 20:42:08 +0100 Subject: [PATCH 1/3] refacto: use hono fire in the oven --- .github/workflows/ci.yml | 1 + bun.lockb | Bin 41242 -> 9250 bytes index.ts | 148 ++++++++++++++++++++++----------------- package.json | 15 ++-- views/critical.css | 13 ++++ views/index.ejs | 71 ------------------- views/index.ts | 90 ++++++++++++++++++++++++ 7 files changed, 192 insertions(+), 146 deletions(-) create mode 100644 views/critical.css delete mode 100644 views/index.ejs create mode 100644 views/index.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 618ef63..f99b9df 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,6 +14,7 @@ jobs: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 - run: bun install + - run: bun x tsc --noEmit e2e: runs-on: ubuntu-latest diff --git a/bun.lockb b/bun.lockb index 40e6e4c0a7977a2721416b43a6cf70daeee79b18..b6abecdf2a5da5c0f6e0c070ce726f6513a697e1 100755 GIT binary patch delta 2057 zcmb_c3rv$&6u$otjQ-_iu|PXep`e1$+FGC$wMC~}5tPATx+rMT3T3PUm)9(E!jzL&%NI{=bm%_ zbMLpSo8GV4EQwi{5TM$=rAIWLv$yU1+LQC^C);ixt8TAa_;H5f?OlAmBN919U|%$W zRtoH8;W5ns_#jl>51I=)m2&CnpaWs8HH$6Uydqt&y(>gG1DyN-Oz}V{0JI7;2~My- z3=vD*MuXO1)UQOS!xJHYFcugMMlc~$iOyot>q;iVoWb`zuv8hHJ#XL2t2dXWPlytA zU)%6r`KG$(MOpmPwNaDn%$lm@qYtEo~v;H{>Q zA)Lff(a#XB;Hao<+{#f?c09mQ)8A4!iBVBga5ToNgraNdn$f%e{G(vNrEHB)} zQBaFfpe$;qj49bpl^8KL9U7khWZl$^u&~pf=a{XK5AwSU?dn}ilbn@hE+W4 z;pgv#&^%%T;o>e{EI#bb@p}zW8K95>`C!VQpbQ5^!dQ1Cv36@1xh_~K3p#Kqo| zNigmG0v;44**E}`L4;`MUZCM5q#aHT?QqISO*S0k#{W)3`H1hfkJKbC$c=->-%Mg` zB&WcQ{aa1k|EJogI8%>2#6K2~dnbj6|5Ldw!YPlvk}rf_*IpLl7moW5GJel;?VZDq z+R7r9f3RL)Zyj86Dm6&3bGGpdp|s=TPb-V2bJx}&1e3eTAvNH=FZLjHMQgNN>?AEg~`~H|h?{j&F@N=mkZNd4@ z_m7Tiuvb0lk?pzLw>7FJr?qY8%x#T{O>wcqUo|%yYL`ZD&l@l`+&0YIVG$o_ta>8& zZF0>rQ-Sp9vkPZNR2PIFE?k69%KXy4TwUog_MQIP(?PpU*9DKS>`#v6MV`t$Vbv5l zu4OB38kY)-Y_*z=zRMaeX0P78`upeS`!>z)tf-pOK#~pcsg(?i05+5iHvJ`ka@=ghi7DQtKFA$ivZ6u zsKSfmoUL=J3%OD#22Gaj(W>3)PIRzWDs=ZdZk$G5$7>oPb` zlSm~}gi^8ADx`vOrBzNP;E$}rP?pvkN($R@=KuVO(-*uEO2I!^<%|DXl3bD?QNr0+ z&S#mNrlb-X{19SW$Z|bR#kl$&&Bl2mNg znaz5m!Q9eOljEr#1x*!C9kmuazlFq-U!gBC8pNf#ycH$oCW|poZWzZPhxOXk3#Jr{moZl3gYJ6RnS)!k7 zPL6b)Q{&d$nbyR3Rk$+Ttgp}+SH;0hTcpo77*~<22Eul{%pKr}gbOoCKoX8LBg&nY Hm*MyW$oUNT literal 41242 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�MqlB;iJ?+P7yn#Sux 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 N7$bVy{y*>k{{xz$j`RQk diff --git a/index.ts b/index.ts index 768e722..84831ca 100644 --- a/index.ts +++ b/index.ts @@ -1,11 +1,8 @@ // -import fastify_cookie, { type FastifyCookieOptions } from "@fastify/cookie"; -import fastify_formbody from "@fastify/formbody"; -import fastify_session, { type FastifySessionOptions } from "@fastify/session"; -import pointOfView from "@fastify/view"; -import ejs from "ejs"; -import Fastify from "fastify"; +import { Hono, type Env } from "hono"; +import { CookieStore, Session, sessionMiddleware } from "hono-sessions"; +import { logger } from "hono/logger"; import { ok } from "node:assert"; import { env as process_env } from "node:process"; import { @@ -16,6 +13,7 @@ import { } from "openid-client"; import Youch from "youch"; import { z } from "zod"; +import { Index } from "./views"; // @@ -40,40 +38,60 @@ const redirectUri = `${env.HOST}${env.CALLBACK_URL}`; // -const fastify = Fastify({ logger: true }); -fastify.register(pointOfView, { engine: { ejs } }); -fastify.register(fastify_formbody); -fastify.register(fastify_cookie, {} as FastifyCookieOptions); - -declare module "fastify" { - interface Session { - verifier: string; - userinfo: string; - idtoken: IdTokenClaims; - oauth2token: TokenSet; - } +interface Session_Context extends Env { + Variables: { + session: Session & { + get(key: "verifier"): string; + set(key: "verifier", value: string): void; + } & { + get(key: "userinfo"): string; + set(key: "userinfo", value: string): void; + } & { + get(key: "idtoken"): IdTokenClaims; + set(key: "idtoken", value: IdTokenClaims): void; + } & { + get(key: "oauth2token"): TokenSet; + set(key: "oauth2token", value: TokenSet): void; + }; + }; } +const hono = new Hono(); -fastify.register(fastify_session, { - cookieName: "mcp_session", - secret: ["key1", "key2"], - cookie: { secure: "auto" }, -} as FastifySessionOptions); - -fastify.get("/", function (req, reply) { - reply.view("/views/index.ejs", { - title: env.SITE_TITLE, - stylesheet_url: env.STYLESHEET_URL, - userinfo: JSON.stringify(req.session.userinfo, null, 2), - idtoken: JSON.stringify(req.session.idtoken, null, 2), - oauth2token: JSON.stringify(req.session.oauth2token, null, 2), - }); +// + +hono.use("*", logger()); + +hono.use( + "*", + sessionMiddleware({ + store: new CookieStore(), + encryptionKey: "a secret with minimum length of 32 characters", + sessionCookieName: "mcp_session", + }), +); + +// + +hono.get("/", ({ html, get }) => { + const session = get("session") || new Session(); + + return html( + Index({ + title: env.SITE_TITLE, + stylesheet_url: env.STYLESHEET_URL, + userinfo: session.get("userinfo"), + idtoken: session.get("idtoken"), + oauth2token: session.get("oauth2token"), + }), + ); }); -fastify.post("/login", async function (req, reply) { +hono.post("/login", async function ({ redirect, get }) { + const session = get("session"); + const client = await getMcpClient(); const code_verifier = generators.codeVerifier(); - req.session.verifier = code_verifier; + session.set("verifier", code_verifier); const code_challenge = generators.codeChallenge(code_verifier); @@ -84,29 +102,31 @@ fastify.post("/login", async function (req, reply) { login_hint: env.LOGIN_HINT, }); - reply.redirect(redirectUrl); + return redirect(redirectUrl); }); -fastify.get(env.CALLBACK_URL, async function (req, reply) { +hono.get(env.CALLBACK_URL, async function ({ req, redirect, get }) { + const session = get("session"); const client = await getMcpClient(); - const params = client.callbackParams(req.raw); + const params = client.callbackParams(req.raw.url); const tokenSet = await client.callback(redirectUri, params, { - code_verifier: req.session.verifier, + code_verifier: session.get("verifier") as string, }); ok(tokenSet.access_token, "Missing tokenSet.access_token"); - req.session.userinfo = await client.userinfo(tokenSet.access_token); - req.session.idtoken = tokenSet.claims(); - req.session.oauth2token = tokenSet; + session.set("userinfo", await client.userinfo(tokenSet.access_token)); + session.set("idtoken", tokenSet.claims()); + session.set("oauth2token", tokenSet); - reply.redirect("/"); + return redirect("/"); }); -fastify.post("/select-organization", async function (req, reply) { +hono.post("/select-organization", async function ({ req, redirect, get }) { + const session = get("session"); const client = await getMcpClient(); const code_verifier = generators.codeVerifier(); - req.session.verifier = code_verifier; + session.set("verifier", code_verifier); const code_challenge = generators.codeChallenge(code_verifier); const redirectUrl = client.authorizationUrl({ @@ -116,13 +136,14 @@ fastify.post("/select-organization", async function (req, reply) { prompt: "select_organization", }); - reply.redirect(redirectUrl); + return redirect(redirectUrl); }); -fastify.post("/update-userinfo", async (req, reply) => { +hono.post("/update-userinfo", async ({ get, redirect }) => { + const session = get("session"); const client = await getMcpClient(); const code_verifier = generators.codeVerifier(); - req.session.verifier = code_verifier; + session.set("verifier", code_verifier); const code_challenge = generators.codeChallenge(code_verifier); const redirectUrl = client.authorizationUrl({ @@ -132,23 +153,26 @@ fastify.post("/update-userinfo", async (req, reply) => { prompt: "update_userinfo", }); - reply.redirect(redirectUrl); + return redirect(redirectUrl); }); -fastify.post("/logout", async (req, reply) => { - await req.session.destroy(); +hono.post("/logout", async ({ get, redirect }) => { + const session = get("session"); + session.deleteSession(); + const client = await getMcpClient(); const redirectUrl = client.endSessionUrl({ post_logout_redirect_uri: `${env.HOST}/`, }); - reply.redirect(redirectUrl); + return redirect(redirectUrl); }); -fastify.post("/force-login", async (req, reply) => { +hono.post("/force-login", async ({ get, redirect }) => { + const session = get("session"); const client = await getMcpClient(); const code_verifier = generators.codeVerifier(); - req.session.verifier = code_verifier; + session.set("verifier", code_verifier); const code_challenge = generators.codeChallenge(code_verifier); const redirectUrl = client.authorizationUrl({ @@ -161,23 +185,15 @@ fastify.post("/force-login", async (req, reply) => { // if so, claims parameter is not necessary as auth_time will be returned }); - reply.redirect(redirectUrl); + return redirect(redirectUrl); }); -fastify.setErrorHandler(async function (error, request, reply) { - try { - const youch = new Youch(error, request.raw); - const html = await youch.toHTML(); - reply.type("text/html").send(html); - } catch (error) { - reply.send(error); - } +hono.onError(async (error, { html, req }) => { + const youch = new Youch(error, req.raw); + return html(await youch.toHTML()); }); -fastify.listen({ port: env.PORT }, () => { - console.log(`App listening on port ${env.PORT}`); - console.log(env); -}); +export default hono; // diff --git a/package.json b/package.json index 6d6022c..1a51f9c 100644 --- a/package.json +++ b/package.json @@ -21,23 +21,20 @@ }, "homepage": "https://github.com/betagouv/moncomptepro-test-client#readme", "dependencies": { - "@fastify/cookie": "^9.2.0", - "@fastify/formbody": "^7.4.0", - "@fastify/session": "^10.7.0", - "@fastify/view": "^8.2.0", - "ejs": "^3.1.9", - "fastify": "^4.25.0", - "fastify-error-page": "^4.0.0", + "hono": "^3.11.7", + "hono-sessions": "^0.3.3", "openid-client": "^5.6.1", "youch": "^3.3.3", "zod": "^3.22.4" }, "devDependencies": { "@tsconfig/bun": "^1.0.1", - "@types/ejs": "^3.1.5", - "bun-types": "^1.0.17", + "bun-types": "^1.0.18", "prettier": "^3.1.1" }, + "overrides": { + "hono": "3.11.7" + }, "engines": { "node": "20", "npm": ">=9" diff --git a/views/critical.css b/views/critical.css new file mode 100644 index 0000000..229f677 --- /dev/null +++ b/views/critical.css @@ -0,0 +1,13 @@ +.moncomptepro-button { + background-color: transparent !important; + background-image: url(data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%22208%22%20height%3D%2254%22%20viewBox%3D%220%200%20208%2054%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20y%3D%220.5%22%20width%3D%22208%22%20height%3D%2253%22%20rx%3D%224%22%20fill%3D%22%23000091%22%2F%3E%3Cg%3E%3Cpath%20d%3D%22M17.9341%2038.4951C17.9207%2038.0928%2018.001%2037.7038%2018.1752%2037.3417L23.1992%2027.3504C23.3465%2027.0553%2023.2662%2026.7334%2023.0518%2026.492C21.1628%2024.534%2020.7877%2021.4762%2022.6231%2019.1159C23.8422%2017.5468%2025.9188%2016.7018%2027.9552%2016.8628C25.5571%2018.1771%2023.9896%2020.6984%2024.137%2023.5282C24.2442%2025.5264%2025.1954%2027.2833%2026.6423%2028.5171C26.5887%2028.5574%2026.5217%2028.5976%2026.4815%2028.6781L24.6863%2032.2455C24.271%2032.5137%2022.891%2031.9504%2022.6767%2032.3796C22.4623%2032.8087%2023.7753%2033.4793%2023.8288%2033.9621C23.8422%2034.123%2023.6681%2034.4181%2023.5475%2034.5254C23.1992%2034.807%2021.9666%2034.5924%2021.7657%2034.9948C21.5647%2035.3971%2022.7035%2035.9872%2022.6901%2036.4298C22.6901%2036.7248%2022.5025%2036.9394%2022.248%2037.1003C21.8327%2037.3686%2020.9082%2037.0064%2020.6939%2037.4356C20.4795%2037.8648%2021.3504%2038.3342%2021.3905%2038.8036C21.4173%2039.0584%2021.1494%2039.5948%2020.9216%2039.7423C20.091%2040.2788%2018.5503%2040.8555%2018.5503%2040.8555C18.336%2040.9091%2017.9876%2040.1983%2018.001%2039.8899L17.9341%2038.5085V38.4951Z%22%20fill%3D%22%23C9191E%22%2F%3E%3Cpath%20d%3D%22M25.919%2012.7858C26.0797%2012.8796%2026.3209%2012.8394%2026.4147%2012.665C27.3659%2011.1496%2029.0807%2010.2108%2030.8626%2010.2108C33.7698%2010.2108%2036.1277%2012.5578%2036.1277%2015.468C36.1277%2016.6482%2035.7258%2017.7345%2035.0693%2018.6196C34.4798%2019.4243%2033.6492%2020.0412%2032.6846%2020.3899C32.1219%2020.6045%2031.5056%2020.7252%2030.8626%2020.7252C30.675%2020.7252%2030.5276%2020.8861%2030.5276%2021.0739C30.5276%2021.2616%2030.675%2021.4226%2030.8626%2021.4226C31.5726%2021.4226%2032.2291%2021.3019%2032.8454%2021.0739C33.3947%2020.8861%2033.8904%2020.6179%2034.3325%2020.296C34.5736%2020.1351%2034.788%2019.9473%2034.9889%2019.7462C35.1765%2019.5316%2035.364%2019.317%2035.5516%2019.1024C36.3554%2018.11%2036.8244%2016.8359%2036.8244%2015.4546C36.8244%2012.1688%2034.1583%209.5%2030.8492%209.5C28.8128%209.5%2026.8836%2010.5595%2025.8118%2012.2895C25.6912%2012.4505%2025.7448%2012.6651%2025.9056%2012.7858H25.919Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M24.9676%2021.9859C25.4365%2019.5853%2027.4729%2017.6272%2029.938%2017.2115C31.7199%2016.9164%2033.3811%2017.3858%2034.6673%2018.3112C34.0912%2019.0622%2033.3141%2019.6389%2032.4031%2019.9608C32.0682%2019.5719%2031.5993%2019.317%2031.0366%2019.317C30.0586%2019.317%2029.2548%2020.1083%2029.2548%2021.0739C29.2548%2022.0261%2030.0586%2022.8174%2031.0366%2022.8174C31.8404%2022.8174%2032.4969%2022.2943%2032.7246%2021.597C33.984%2021.208%2035.0826%2020.457%2035.8864%2019.4377C36.717%2020.4704%2037.2127%2021.7579%2037.2127%2023.1661C37.2127%2025.7544%2035.5515%2027.9807%2033.1936%2028.8256C32.9792%2028.9061%2032.8318%2029.0938%2032.8318%2029.3218V33.4793C32.5773%2033.9085%2031.0768%2033.9755%2031.0768%2034.4717C31.0768%2034.968%2032.5773%2035.035%2032.8318%2035.4642C32.9122%2035.6117%2032.8988%2035.9604%2032.8318%2036.1213C32.6443%2036.5371%2031.4251%2036.8723%2031.4251%2037.3417C31.4251%2037.7977%2032.7246%2037.8782%2032.9256%2038.2939C33.0596%2038.5756%2032.9926%2038.8572%2032.8318%2039.112C32.5773%2039.5412%2031.5725%2039.6082%2031.5725%2040.1045C31.5725%2040.6007%2032.5773%2040.6677%2032.8318%2041.0969C32.9658%2041.3383%2032.9658%2041.9552%2032.8318%2042.1832C32.3227%2043.0415%2031.184%2044.2619%2031.184%2044.2619C31.0098%2044.4095%2030.3801%2043.873%2030.2462%2043.5914L29.5495%2042.3173C29.3485%2041.9552%2029.2414%2041.5395%2029.2414%2041.1237V29.523C29.2414%2029.1877%2029.027%2028.9061%2028.7189%2028.7854C26.1064%2027.7527%2024.3782%2025.0436%2024.9676%2022.0127V21.9859Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M19.7027%2015.696C21.5917%2014.1268%2024.4051%2013.9123%2026.5754%2015.1729C27.3525%2015.6289%2027.4597%2015.6021%2027.9554%2016.2592C25.6778%2015.3741%2023.5343%2016.5677%2021.8998%2018.566C19.984%2020.8995%2020.2117%2024.2791%2022.3285%2026.3713C22.1276%2026.3177%2021.9132%2026.2774%2021.7122%2026.2104C21.4979%2026.1299%2021.2701%2026.1835%2021.1228%2026.3579L18.4835%2029.5632C18.0146%2029.7375%2016.8088%2028.8256%2016.5007%2029.2145C16.1926%2029.6034%2017.3045%2030.6092%2017.2242%2031.0921C17.1974%2031.253%2016.9562%2031.5212%2016.8088%2031.5883C16.3935%2031.7894%2015.2414%2031.2798%2014.9466%2031.6285C14.6519%2031.9772%2015.6165%2032.8623%2015.4959%2033.3183C15.4155%2033.6134%2015.1878%2033.7877%2014.9064%2033.895C14.4375%2034.0693%2013.6203%2033.4792%2013.3122%2033.8548C13.004%2034.2303%2013.7275%2034.9277%2013.6471%2035.4239C13.6069%2035.6921%2013.205%2036.1749%2012.9504%2036.2688C12.0126%2036.6175%2010.3648%2036.8321%2010.3648%2036.8321C10.137%2036.8321%209.98963%2036.0274%2010.07%2035.7189L10.338%2034.2973C10.4183%2033.8816%2010.5925%2033.5061%2010.8605%2033.1842L18.2156%2024.2255C18.4299%2023.9707%2018.4433%2023.6086%2018.2825%2023.3135C16.916%2020.8593%2017.3045%2017.6674%2019.6759%2015.696H19.7027Z%22%20fill%3D%22%230071BC%22%2F%3E%3C%2Fg%3E%3Cpath%20d%3D%22M47.986%2019.868C49.023%2021.16%2050.332%2021.823%2052.1%2021.823C54.174%2021.823%2055.755%2020.497%2055.755%2018.474C55.755%2014.666%2050.128%2014.989%2050.128%2012.422C50.128%2011.436%2050.859%2010.688%2051.964%2010.688C53.001%2010.688%2053.851%2011.232%2054.548%2012.235L55.738%2011.198C54.854%2010.025%2053.63%209.26%2051.947%209.26C49.924%209.26%2048.496%2010.722%2048.496%2012.456C48.496%2016.247%2054.123%2015.941%2054.123%2018.491C54.123%2019.579%2053.375%2020.395%2052.083%2020.395C50.961%2020.395%2049.975%2019.851%2049.142%2018.797L47.986%2019.868ZM58.8029%2014.156L60.5539%209.6H58.9049L57.4599%2014.156H58.8029ZM63.6214%2010.705C64.1824%2010.705%2064.6244%2010.246%2064.6244%209.685C64.6244%209.141%2064.1824%208.682%2063.6214%208.682C63.0604%208.682%2062.6014%209.141%2062.6014%209.685C62.6014%2010.246%2063.0604%2010.705%2063.6214%2010.705ZM62.8904%2021.5H64.3354V12.932H62.8904V21.5ZM66.6584%2017.216C66.6584%2019.715%2068.3754%2021.84%2071.0614%2021.84C72.3024%2021.84%2073.3224%2021.381%2074.1044%2020.548V21.5H75.5494V8.75H74.1044V13.884C73.3224%2013.051%2072.3024%2012.592%2071.0614%2012.592C68.3754%2012.592%2066.6584%2014.717%2066.6584%2017.216ZM68.1884%2017.216C68.1884%2015.397%2069.4124%2013.952%2071.2314%2013.952C72.4044%2013.952%2073.4244%2014.513%2074.1044%2015.55V18.882C73.4414%2019.902%2072.4214%2020.48%2071.2314%2020.48C69.4124%2020.48%2068.1884%2019.035%2068.1884%2017.216ZM86.2114%2020.089L85.1404%2019.256C84.5794%2020.021%2083.6614%2020.531%2082.5734%2020.531C80.6524%2020.531%2079.3604%2019.154%2079.3604%2017.267V17.233H85.9224C85.9734%2016.995%2086.0244%2016.655%2086.0244%2016.315C86.0244%2014.173%2084.5114%2012.592%2082.1824%2012.592C79.5304%2012.592%2077.8644%2014.615%2077.8644%2017.216C77.8644%2019.715%2079.6494%2021.84%2082.5394%2021.84C84.1374%2021.84%2085.4124%2021.16%2086.2114%2020.089ZM82.1994%2013.833C83.6104%2013.833%2084.5114%2014.853%2084.5624%2016.094H79.4794C79.8194%2014.615%2080.8054%2013.833%2082.1994%2013.833ZM88.4734%2021.5H89.9184V15.567C90.4624%2014.666%2091.2444%2013.952%2092.4854%2013.952C93.8114%2013.952%2094.6614%2014.836%2094.6614%2016.366V21.5H96.1234V16.315C96.1234%2013.884%2094.6954%2012.592%2092.7744%2012.592C91.4994%2012.592%2090.6154%2013.136%2089.9184%2013.901V12.932H88.4734V21.5ZM99.525%2018.627C99.525%2020.718%20100.596%2021.67%20102.5%2021.67C103.112%2021.67%20103.571%2021.602%20103.979%2021.432V20.14C103.656%2020.276%20103.265%2020.344%20102.704%2020.344C101.667%2020.344%20100.987%2019.97%20100.987%2018.627V14.258H103.962V12.932H100.987V10.79H99.525V12.932H97.91V14.258H99.525V18.627ZM106.902%2010.705C107.463%2010.705%20107.905%2010.246%20107.905%209.685C107.905%209.141%20107.463%208.682%20106.902%208.682C106.341%208.682%20105.882%209.141%20105.882%209.685C105.882%2010.246%20106.341%2010.705%20106.902%2010.705ZM106.171%2021.5H107.616V12.932H106.171V21.5ZM109.548%2012.932V14.258H111.163V21.5H112.625V14.258H115.6V12.932H112.625V11.844C112.625%2010.739%20113.288%2010.059%20114.223%2010.059C114.818%2010.059%20115.209%2010.297%20115.515%2010.637L116.416%209.583C115.906%209.09%20115.158%208.75%20114.206%208.75C112.37%208.75%20111.163%2010.042%20111.163%2011.878V12.932H109.548ZM118.091%2010.705C118.652%2010.705%20119.094%2010.246%20119.094%209.685C119.094%209.141%20118.652%208.682%20118.091%208.682C117.53%208.682%20117.071%209.141%20117.071%209.685C117.071%2010.246%20117.53%2010.705%20118.091%2010.705ZM117.36%2021.5H118.805V12.932H117.36V21.5ZM129.475%2020.089L128.404%2019.256C127.843%2020.021%20126.925%2020.531%20125.837%2020.531C123.916%2020.531%20122.624%2019.154%20122.624%2017.267V17.233H129.186C129.237%2016.995%20129.288%2016.655%20129.288%2016.315C129.288%2014.173%20127.775%2012.592%20125.446%2012.592C122.794%2012.592%20121.128%2014.615%20121.128%2017.216C121.128%2019.715%20122.913%2021.84%20125.803%2021.84C127.401%2021.84%20128.676%2021.16%20129.475%2020.089ZM125.463%2013.833C126.874%2013.833%20127.775%2014.853%20127.826%2016.094H122.743C123.083%2014.615%20124.069%2013.833%20125.463%2013.833ZM131.737%2021.5H133.182V15.686C133.709%2014.819%20134.44%2014.241%20135.562%2014.241C135.902%2014.241%20136.157%2014.292%20136.412%2014.36V12.864C136.208%2012.796%20135.953%2012.762%20135.681%2012.762C134.593%2012.762%20133.811%2013.255%20133.182%2014.003V12.932H131.737V21.5ZM145.422%2021.84C146.578%2021.84%20147.649%2021.313%20148.295%2020.412V21.5H149.74V15.754C149.74%2013.867%20148.448%2012.592%20146.272%2012.592C144.776%2012.592%20143.569%2013.221%20142.821%2014.241L143.909%2015.074C144.402%2014.326%20145.235%2013.884%20146.238%2013.884C147.445%2013.884%20148.295%2014.564%20148.295%2015.754V16.349L145.422%2016.825C143.586%2017.114%20142.6%2018.066%20142.6%2019.392C142.6%2020.888%20143.739%2021.84%20145.422%2021.84ZM144.045%2019.341C144.045%2018.593%20144.572%2018.049%20145.762%2017.862L148.295%2017.42V19.052C147.7%2020.038%20146.799%2020.633%20145.66%2020.633C144.674%2020.633%20144.045%2020.072%20144.045%2019.341ZM151.297%2012.932L154.646%2021.5H156.55L159.899%2012.932H158.335L155.598%2019.987L152.861%2012.932H151.297ZM169.153%2020.089L168.082%2019.256C167.521%2020.021%20166.603%2020.531%20165.515%2020.531C163.594%2020.531%20162.302%2019.154%20162.302%2017.267V17.233H168.864C168.915%2016.995%20168.966%2016.655%20168.966%2016.315C168.966%2014.173%20167.453%2012.592%20165.124%2012.592C162.472%2012.592%20160.806%2014.615%20160.806%2017.216C160.806%2019.715%20162.591%2021.84%20165.481%2021.84C167.079%2021.84%20168.354%2021.16%20169.153%2020.089ZM165.141%2013.833C166.552%2013.833%20167.453%2014.853%20167.504%2016.094H162.421C162.761%2014.615%20163.747%2013.833%20165.141%2013.833ZM175.326%2020.48C173.473%2020.48%20172.164%2019.052%20172.164%2017.216C172.164%2015.397%20173.473%2013.952%20175.309%2013.952C176.363%2013.952%20177.23%2014.462%20177.757%2015.227L178.913%2014.343C178.114%2013.289%20176.856%2012.592%20175.309%2012.592C172.47%2012.592%20170.651%2014.717%20170.651%2017.216C170.651%2019.715%20172.47%2021.84%20175.309%2021.84C176.873%2021.84%20178.114%2021.16%20178.913%2020.089L177.757%2019.205C177.23%2019.97%20176.38%2020.48%20175.326%2020.48Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M49.06%2042.5V28.5H52.64L56.02%2034.26L59.4%2028.5H62.98V42.5H60.14V32.54L57.02%2037.7H55.02L51.9%2032.54V42.5H49.06ZM71.2106%2032.02C72.024%2032.02%2072.7706%2032.1667%2073.4506%2032.46C74.1306%2032.74%2074.7106%2033.1267%2075.1906%2033.62C75.684%2034.1%2076.064%2034.6733%2076.3306%2035.34C76.5973%2036.0067%2076.7306%2036.7133%2076.7306%2037.46C76.7306%2038.2067%2076.5973%2038.9133%2076.3306%2039.58C76.064%2040.2467%2075.684%2040.8267%2075.1906%2041.32C74.7106%2041.8%2074.1306%2042.1867%2073.4506%2042.48C72.7706%2042.76%2072.024%2042.9%2071.2106%2042.9C70.3973%2042.9%2069.6506%2042.76%2068.9706%2042.48C68.2906%2042.1867%2067.704%2041.8%2067.2106%2041.32C66.7306%2040.8267%2066.3573%2040.2467%2066.0906%2039.58C65.824%2038.9133%2065.6906%2038.2067%2065.6906%2037.46C65.6906%2036.7133%2065.824%2036.0067%2066.0906%2035.34C66.3573%2034.6733%2066.7306%2034.1%2067.2106%2033.62C67.704%2033.1267%2068.2906%2032.74%2068.9706%2032.46C69.6506%2032.1667%2070.3973%2032.02%2071.2106%2032.02ZM71.2506%2040.5C72.0506%2040.5%2072.724%2040.2133%2073.2706%2039.64C73.8173%2039.0533%2074.0906%2038.3267%2074.0906%2037.46C74.0906%2036.58%2073.8173%2035.8533%2073.2706%2035.28C72.724%2034.7067%2072.0506%2034.42%2071.2506%2034.42C70.4106%2034.42%2069.7106%2034.7067%2069.1506%2035.28C68.604%2035.8533%2068.3306%2036.58%2068.3306%2037.46C68.3306%2038.34%2068.604%2039.0667%2069.1506%2039.64C69.7106%2040.2133%2070.4106%2040.5%2071.2506%2040.5ZM79.0473%2042.5V32.42H81.5873V33.22C81.934%2032.8867%2082.3473%2032.6067%2082.8273%2032.38C83.3207%2032.14%2083.9007%2032.02%2084.5673%2032.02C85.114%2032.02%2085.6207%2032.1133%2086.0873%2032.3C86.5673%2032.4867%2086.9807%2032.7667%2087.3273%2033.14C87.6873%2033.5133%2087.9673%2033.98%2088.1673%2034.54C88.3807%2035.1%2088.4873%2035.7533%2088.4873%2036.5V42.5H85.9073V36.6C85.9073%2035.9333%2085.7273%2035.4067%2085.3673%2035.02C85.0207%2034.62%2084.5407%2034.42%2083.9273%2034.42C83.2873%2034.42%2082.7807%2034.5933%2082.4073%2034.94C82.0473%2035.2733%2081.774%2035.6%2081.5873%2035.92V42.5H79.0473ZM98.1516%2040.24C98.9516%2040.24%2099.6582%2040.0667%20100.272%2039.72C100.898%2039.36%20101.412%2038.8933%20101.812%2038.32L104.052%2040.04C103.412%2040.9067%20102.585%2041.6%20101.572%2042.12C100.558%2042.64%2099.4182%2042.9%2098.1516%2042.9C97.0582%2042.9%2096.0516%2042.7%2095.1316%2042.3C94.2116%2041.9%2093.4249%2041.3667%2092.7716%2040.7C92.1182%2040.0333%2091.6116%2039.2533%2091.2516%2038.36C90.8916%2037.4533%2090.7116%2036.5%2090.7116%2035.5C90.7116%2034.5%2090.8916%2033.5533%2091.2516%2032.66C91.6116%2031.7533%2092.1182%2030.9667%2092.7716%2030.3C93.4249%2029.6333%2094.2116%2029.1%2095.1316%2028.7C96.0516%2028.3%2097.0582%2028.1%2098.1516%2028.1C99.4182%2028.1%20100.558%2028.3667%20101.572%2028.9C102.585%2029.42%20103.412%2030.1%20104.052%2030.94L101.812%2032.68C101.412%2032.1067%20100.898%2031.6467%20100.272%2031.3C99.6582%2030.94%2098.9516%2030.76%2098.1516%2030.76C97.4982%2030.76%2096.8916%2030.8867%2096.3316%2031.14C95.7716%2031.38%2095.2916%2031.7133%2094.8916%2032.14C94.5049%2032.5533%2094.1982%2033.0533%2093.9716%2033.64C93.7449%2034.2133%2093.6316%2034.8333%2093.6316%2035.5C93.6316%2036.1667%2093.7449%2036.7933%2093.9716%2037.38C94.1982%2037.9533%2094.5049%2038.4533%2094.8916%2038.88C95.2916%2039.2933%2095.7716%2039.6267%2096.3316%2039.88C96.8916%2040.12%2097.4982%2040.24%2098.1516%2040.24ZM110.781%2032.02C111.594%2032.02%20112.341%2032.1667%20113.021%2032.46C113.701%2032.74%20114.281%2033.1267%20114.761%2033.62C115.254%2034.1%20115.634%2034.6733%20115.901%2035.34C116.168%2036.0067%20116.301%2036.7133%20116.301%2037.46C116.301%2038.2067%20116.168%2038.9133%20115.901%2039.58C115.634%2040.2467%20115.254%2040.8267%20114.761%2041.32C114.281%2041.8%20113.701%2042.1867%20113.021%2042.48C112.341%2042.76%20111.594%2042.9%20110.781%2042.9C109.968%2042.9%20109.221%2042.76%20108.541%2042.48C107.861%2042.1867%20107.274%2041.8%20106.781%2041.32C106.301%2040.8267%20105.928%2040.2467%20105.661%2039.58C105.394%2038.9133%20105.261%2038.2067%20105.261%2037.46C105.261%2036.7133%20105.394%2036.0067%20105.661%2035.34C105.928%2034.6733%20106.301%2034.1%20106.781%2033.62C107.274%2033.1267%20107.861%2032.74%20108.541%2032.46C109.221%2032.1667%20109.968%2032.02%20110.781%2032.02ZM110.821%2040.5C111.621%2040.5%20112.294%2040.2133%20112.841%2039.64C113.388%2039.0533%20113.661%2038.3267%20113.661%2037.46C113.661%2036.58%20113.388%2035.8533%20112.841%2035.28C112.294%2034.7067%20111.621%2034.42%20110.821%2034.42C109.981%2034.42%20109.281%2034.7067%20108.721%2035.28C108.174%2035.8533%20107.901%2036.58%20107.901%2037.46C107.901%2038.34%20108.174%2039.0667%20108.721%2039.64C109.281%2040.2133%20109.981%2040.5%20110.821%2040.5ZM118.618%2042.5V32.42H121.158V33.18C121.491%2032.8467%20121.884%2032.5733%20122.338%2032.36C122.791%2032.1333%20123.324%2032.02%20123.938%2032.02C124.591%2032.02%20125.191%2032.1733%20125.738%2032.48C126.298%2032.7733%20126.744%2033.2067%20127.078%2033.78C127.451%2033.3267%20127.898%2032.92%20128.418%2032.56C128.938%2032.2%20129.591%2032.02%20130.378%2032.02C130.898%2032.02%20131.384%2032.1133%20131.838%2032.3C132.291%2032.4733%20132.684%2032.74%20133.018%2033.1C133.351%2033.4467%20133.611%2033.8933%20133.798%2034.44C133.998%2034.9733%20134.098%2035.5933%20134.098%2036.3V42.5H131.538V36.4C131.538%2035.7867%20131.378%2035.3067%20131.058%2034.96C130.751%2034.6%20130.311%2034.42%20129.738%2034.42C129.204%2034.42%20128.771%2034.58%20128.438%2034.9C128.104%2035.2067%20127.838%2035.5267%20127.638%2035.86C127.651%2035.9267%20127.658%2036%20127.658%2036.08C127.658%2036.16%20127.658%2036.2333%20127.658%2036.3V42.5H125.078V36.4C125.078%2035.7867%20124.924%2035.3067%20124.618%2034.96C124.311%2034.6%20123.871%2034.42%20123.298%2034.42C122.724%2034.42%20122.271%2034.5933%20121.938%2034.94C121.604%2035.2733%20121.344%2035.6%20121.158%2035.92V42.5H118.618ZM136.997%2047.42V32.42H139.537V33.14C139.937%2032.78%20140.397%2032.5067%20140.917%2032.32C141.437%2032.12%20142.023%2032.02%20142.677%2032.02C143.477%2032.02%20144.19%2032.1667%20144.817%2032.46C145.457%2032.7533%20145.997%2033.1467%20146.437%2033.64C146.877%2034.1333%20147.21%2034.7133%20147.437%2035.38C147.677%2036.0333%20147.797%2036.7267%20147.797%2037.46C147.797%2038.1933%20147.677%2038.8933%20147.437%2039.56C147.21%2040.2133%20146.877%2040.7867%20146.437%2041.28C145.997%2041.7733%20145.457%2042.1667%20144.817%2042.46C144.19%2042.7533%20143.477%2042.9%20142.677%2042.9C142.023%2042.9%20141.437%2042.8%20140.917%2042.6C140.397%2042.4133%20139.937%2042.14%20139.537%2041.78V47.42H136.997ZM139.557%2038.98C139.89%2039.4733%20140.283%2039.8533%20140.737%2040.12C141.203%2040.3733%20141.73%2040.5%20142.317%2040.5C143.17%2040.5%20143.857%2040.2133%20144.377%2039.64C144.897%2039.0667%20145.157%2038.34%20145.157%2037.46C145.157%2036.58%20144.897%2035.8533%20144.377%2035.28C143.857%2034.7067%20143.17%2034.42%20142.317%2034.42C141.73%2034.42%20141.203%2034.5533%20140.737%2034.82C140.283%2035.0733%20139.89%2035.4467%20139.557%2035.94L139.537%2035.92V39L139.557%2038.98ZM150.644%2038.82V34.74H148.764V32.42H150.644V29.9H153.204V32.42H156.284V34.74H153.204V38.82C153.204%2039.38%20153.344%2039.78%20153.624%2040.02C153.918%2040.26%20154.311%2040.38%20154.804%2040.38C155.151%2040.38%20155.444%2040.36%20155.684%2040.32C155.924%2040.28%20156.131%2040.2267%20156.304%2040.16V42.38C156.051%2042.4867%20155.764%2042.5667%20155.444%2042.62C155.138%2042.6733%20154.778%2042.7%20154.364%2042.7C153.111%2042.7%20152.178%2042.36%20151.564%2041.68C150.951%2041%20150.644%2040.0467%20150.644%2038.82ZM167.644%2040.86C167.177%2041.4867%20166.564%2041.9867%20165.804%2042.36C165.044%2042.72%20164.19%2042.9%20163.244%2042.9C162.35%2042.9%20161.55%2042.7533%20160.844%2042.46C160.15%2042.1667%20159.564%2041.7733%20159.084%2041.28C158.617%2040.7867%20158.257%2040.2133%20158.004%2039.56C157.764%2038.8933%20157.644%2038.1933%20157.644%2037.46C157.644%2036.7133%20157.757%2036.0133%20157.984%2035.36C158.224%2034.6933%20158.564%2034.1133%20159.004%2033.62C159.444%2033.1267%20159.984%2032.74%20160.624%2032.46C161.264%2032.1667%20161.997%2032.02%20162.824%2032.02C164.21%2032.02%20165.33%2032.4467%20166.184%2033.3C167.037%2034.14%20167.464%2035.22%20167.464%2036.54C167.464%2036.82%20167.444%2037.0867%20167.404%2037.34C167.377%2037.5933%20167.344%2037.8067%20167.304%2037.98H160.244C160.324%2038.8067%20160.637%2039.4533%20161.184%2039.92C161.73%2040.3867%20162.43%2040.62%20163.284%2040.62C163.83%2040.62%20164.324%2040.5133%20164.764%2040.3C165.204%2040.0733%20165.557%2039.78%20165.824%2039.42L167.644%2040.86ZM162.824%2034.14C162.21%2034.14%20161.697%2034.3%20161.284%2034.62C160.87%2034.9267%20160.577%2035.4067%20160.404%2036.06H164.944C164.93%2035.5667%20164.737%2035.1267%20164.364%2034.74C164.004%2034.34%20163.49%2034.14%20162.824%2034.14ZM170.486%2042.5V28.5H175.106C176.639%2028.5%20177.846%2028.8733%20178.726%2029.62C179.619%2030.3667%20180.066%2031.3867%20180.066%2032.68C180.066%2033.96%20179.619%2034.9733%20178.726%2035.72C177.846%2036.4667%20176.639%2036.84%20175.106%2036.84H173.326V42.5H170.486ZM175.226%2030.92H173.326V34.42H175.226C175.826%2034.42%20176.292%2034.2667%20176.626%2033.96C176.972%2033.6533%20177.146%2033.2133%20177.146%2032.64C177.146%2032.1067%20176.972%2031.6867%20176.626%2031.38C176.292%2031.0733%20175.826%2030.92%20175.226%2030.92ZM182.036%2042.5V32.42H184.576V33.42C184.909%2033.0867%20185.289%2032.8067%20185.716%2032.58C186.156%2032.34%20186.662%2032.22%20187.236%2032.22C187.409%2032.22%20187.569%2032.2333%20187.716%2032.26C187.862%2032.2867%20187.996%2032.32%20188.116%2032.36V35.02C187.956%2034.98%20187.782%2034.9467%20187.596%2034.92C187.422%2034.8933%20187.222%2034.88%20186.996%2034.88C186.382%2034.88%20185.869%2035.02%20185.456%2035.3C185.056%2035.58%20184.762%2035.8733%20184.576%2036.18V42.5H182.036ZM194.687%2032.02C195.501%2032.02%20196.247%2032.1667%20196.927%2032.46C197.607%2032.74%20198.187%2033.1267%20198.667%2033.62C199.161%2034.1%20199.541%2034.6733%20199.807%2035.34C200.074%2036.0067%20200.207%2036.7133%20200.207%2037.46C200.207%2038.2067%20200.074%2038.9133%20199.807%2039.58C199.541%2040.2467%20199.161%2040.8267%20198.667%2041.32C198.187%2041.8%20197.607%2042.1867%20196.927%2042.48C196.247%2042.76%20195.501%2042.9%20194.687%2042.9C193.874%2042.9%20193.127%2042.76%20192.447%2042.48C191.767%2042.1867%20191.181%2041.8%20190.687%2041.32C190.207%2040.8267%20189.834%2040.2467%20189.567%2039.58C189.301%2038.9133%20189.167%2038.2067%20189.167%2037.46C189.167%2036.7133%20189.301%2036.0067%20189.567%2035.34C189.834%2034.6733%20190.207%2034.1%20190.687%2033.62C191.181%2033.1267%20191.767%2032.74%20192.447%2032.46C193.127%2032.1667%20193.874%2032.02%20194.687%2032.02ZM194.727%2040.5C195.527%2040.5%20196.201%2040.2133%20196.747%2039.64C197.294%2039.0533%20197.567%2038.3267%20197.567%2037.46C197.567%2036.58%20197.294%2035.8533%20196.747%2035.28C196.201%2034.7067%20195.527%2034.42%20194.727%2034.42C193.887%2034.42%20193.187%2034.7067%20192.627%2035.28C192.081%2035.8533%20191.807%2036.58%20191.807%2037.46C191.807%2038.34%20192.081%2039.0667%20192.627%2039.64C193.187%2040.2133%20193.887%2040.5%20194.727%2040.5Z%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E); + background-position: 50% 50%; + background-repeat: no-repeat; + width: 214px; + height: 56px; + border: none; +} + +.moncomptepro-button:hover { + background-image: url(data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%22208%22%20height%3D%2254%22%20viewBox%3D%220%200%20208%2054%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20y%3D%220.5%22%20width%3D%22208%22%20height%3D%2253%22%20rx%3D%224%22%20fill%3D%22%231212ff%22%2F%3E%3Cg%3E%3Cpath%20d%3D%22M17.9341%2038.4951C17.9207%2038.0928%2018.001%2037.7038%2018.1752%2037.3417L23.1992%2027.3504C23.3465%2027.0553%2023.2662%2026.7334%2023.0518%2026.492C21.1628%2024.534%2020.7877%2021.4762%2022.6231%2019.1159C23.8422%2017.5468%2025.9188%2016.7018%2027.9552%2016.8628C25.5571%2018.1771%2023.9896%2020.6984%2024.137%2023.5282C24.2442%2025.5264%2025.1954%2027.2833%2026.6423%2028.5171C26.5887%2028.5574%2026.5217%2028.5976%2026.4815%2028.6781L24.6863%2032.2455C24.271%2032.5137%2022.891%2031.9504%2022.6767%2032.3796C22.4623%2032.8087%2023.7753%2033.4793%2023.8288%2033.9621C23.8422%2034.123%2023.6681%2034.4181%2023.5475%2034.5254C23.1992%2034.807%2021.9666%2034.5924%2021.7657%2034.9948C21.5647%2035.3971%2022.7035%2035.9872%2022.6901%2036.4298C22.6901%2036.7248%2022.5025%2036.9394%2022.248%2037.1003C21.8327%2037.3686%2020.9082%2037.0064%2020.6939%2037.4356C20.4795%2037.8648%2021.3504%2038.3342%2021.3905%2038.8036C21.4173%2039.0584%2021.1494%2039.5948%2020.9216%2039.7423C20.091%2040.2788%2018.5503%2040.8555%2018.5503%2040.8555C18.336%2040.9091%2017.9876%2040.1983%2018.001%2039.8899L17.9341%2038.5085V38.4951Z%22%20fill%3D%22%23C9191E%22%2F%3E%3Cpath%20d%3D%22M25.919%2012.7858C26.0797%2012.8796%2026.3209%2012.8394%2026.4147%2012.665C27.3659%2011.1496%2029.0807%2010.2108%2030.8626%2010.2108C33.7698%2010.2108%2036.1277%2012.5578%2036.1277%2015.468C36.1277%2016.6482%2035.7258%2017.7345%2035.0693%2018.6196C34.4798%2019.4243%2033.6492%2020.0412%2032.6846%2020.3899C32.1219%2020.6045%2031.5056%2020.7252%2030.8626%2020.7252C30.675%2020.7252%2030.5276%2020.8861%2030.5276%2021.0739C30.5276%2021.2616%2030.675%2021.4226%2030.8626%2021.4226C31.5726%2021.4226%2032.2291%2021.3019%2032.8454%2021.0739C33.3947%2020.8861%2033.8904%2020.6179%2034.3325%2020.296C34.5736%2020.1351%2034.788%2019.9473%2034.9889%2019.7462C35.1765%2019.5316%2035.364%2019.317%2035.5516%2019.1024C36.3554%2018.11%2036.8244%2016.8359%2036.8244%2015.4546C36.8244%2012.1688%2034.1583%209.5%2030.8492%209.5C28.8128%209.5%2026.8836%2010.5595%2025.8118%2012.2895C25.6912%2012.4505%2025.7448%2012.6651%2025.9056%2012.7858H25.919Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M24.9676%2021.9859C25.4365%2019.5853%2027.4729%2017.6272%2029.938%2017.2115C31.7199%2016.9164%2033.3811%2017.3858%2034.6673%2018.3112C34.0912%2019.0622%2033.3141%2019.6389%2032.4031%2019.9608C32.0682%2019.5719%2031.5993%2019.317%2031.0366%2019.317C30.0586%2019.317%2029.2548%2020.1083%2029.2548%2021.0739C29.2548%2022.0261%2030.0586%2022.8174%2031.0366%2022.8174C31.8404%2022.8174%2032.4969%2022.2943%2032.7246%2021.597C33.984%2021.208%2035.0826%2020.457%2035.8864%2019.4377C36.717%2020.4704%2037.2127%2021.7579%2037.2127%2023.1661C37.2127%2025.7544%2035.5515%2027.9807%2033.1936%2028.8256C32.9792%2028.9061%2032.8318%2029.0938%2032.8318%2029.3218V33.4793C32.5773%2033.9085%2031.0768%2033.9755%2031.0768%2034.4717C31.0768%2034.968%2032.5773%2035.035%2032.8318%2035.4642C32.9122%2035.6117%2032.8988%2035.9604%2032.8318%2036.1213C32.6443%2036.5371%2031.4251%2036.8723%2031.4251%2037.3417C31.4251%2037.7977%2032.7246%2037.8782%2032.9256%2038.2939C33.0596%2038.5756%2032.9926%2038.8572%2032.8318%2039.112C32.5773%2039.5412%2031.5725%2039.6082%2031.5725%2040.1045C31.5725%2040.6007%2032.5773%2040.6677%2032.8318%2041.0969C32.9658%2041.3383%2032.9658%2041.9552%2032.8318%2042.1832C32.3227%2043.0415%2031.184%2044.2619%2031.184%2044.2619C31.0098%2044.4095%2030.3801%2043.873%2030.2462%2043.5914L29.5495%2042.3173C29.3485%2041.9552%2029.2414%2041.5395%2029.2414%2041.1237V29.523C29.2414%2029.1877%2029.027%2028.9061%2028.7189%2028.7854C26.1064%2027.7527%2024.3782%2025.0436%2024.9676%2022.0127V21.9859Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M19.7027%2015.696C21.5917%2014.1268%2024.4051%2013.9123%2026.5754%2015.1729C27.3525%2015.6289%2027.4597%2015.6021%2027.9554%2016.2592C25.6778%2015.3741%2023.5343%2016.5677%2021.8998%2018.566C19.984%2020.8995%2020.2117%2024.2791%2022.3285%2026.3713C22.1276%2026.3177%2021.9132%2026.2774%2021.7122%2026.2104C21.4979%2026.1299%2021.2701%2026.1835%2021.1228%2026.3579L18.4835%2029.5632C18.0146%2029.7375%2016.8088%2028.8256%2016.5007%2029.2145C16.1926%2029.6034%2017.3045%2030.6092%2017.2242%2031.0921C17.1974%2031.253%2016.9562%2031.5212%2016.8088%2031.5883C16.3935%2031.7894%2015.2414%2031.2798%2014.9466%2031.6285C14.6519%2031.9772%2015.6165%2032.8623%2015.4959%2033.3183C15.4155%2033.6134%2015.1878%2033.7877%2014.9064%2033.895C14.4375%2034.0693%2013.6203%2033.4792%2013.3122%2033.8548C13.004%2034.2303%2013.7275%2034.9277%2013.6471%2035.4239C13.6069%2035.6921%2013.205%2036.1749%2012.9504%2036.2688C12.0126%2036.6175%2010.3648%2036.8321%2010.3648%2036.8321C10.137%2036.8321%209.98963%2036.0274%2010.07%2035.7189L10.338%2034.2973C10.4183%2033.8816%2010.5925%2033.5061%2010.8605%2033.1842L18.2156%2024.2255C18.4299%2023.9707%2018.4433%2023.6086%2018.2825%2023.3135C16.916%2020.8593%2017.3045%2017.6674%2019.6759%2015.696H19.7027Z%22%20fill%3D%22%230071BC%22%2F%3E%3C%2Fg%3E%3Cpath%20d%3D%22M47.986%2019.868C49.023%2021.16%2050.332%2021.823%2052.1%2021.823C54.174%2021.823%2055.755%2020.497%2055.755%2018.474C55.755%2014.666%2050.128%2014.989%2050.128%2012.422C50.128%2011.436%2050.859%2010.688%2051.964%2010.688C53.001%2010.688%2053.851%2011.232%2054.548%2012.235L55.738%2011.198C54.854%2010.025%2053.63%209.26%2051.947%209.26C49.924%209.26%2048.496%2010.722%2048.496%2012.456C48.496%2016.247%2054.123%2015.941%2054.123%2018.491C54.123%2019.579%2053.375%2020.395%2052.083%2020.395C50.961%2020.395%2049.975%2019.851%2049.142%2018.797L47.986%2019.868ZM58.8029%2014.156L60.5539%209.6H58.9049L57.4599%2014.156H58.8029ZM63.6214%2010.705C64.1824%2010.705%2064.6244%2010.246%2064.6244%209.685C64.6244%209.141%2064.1824%208.682%2063.6214%208.682C63.0604%208.682%2062.6014%209.141%2062.6014%209.685C62.6014%2010.246%2063.0604%2010.705%2063.6214%2010.705ZM62.8904%2021.5H64.3354V12.932H62.8904V21.5ZM66.6584%2017.216C66.6584%2019.715%2068.3754%2021.84%2071.0614%2021.84C72.3024%2021.84%2073.3224%2021.381%2074.1044%2020.548V21.5H75.5494V8.75H74.1044V13.884C73.3224%2013.051%2072.3024%2012.592%2071.0614%2012.592C68.3754%2012.592%2066.6584%2014.717%2066.6584%2017.216ZM68.1884%2017.216C68.1884%2015.397%2069.4124%2013.952%2071.2314%2013.952C72.4044%2013.952%2073.4244%2014.513%2074.1044%2015.55V18.882C73.4414%2019.902%2072.4214%2020.48%2071.2314%2020.48C69.4124%2020.48%2068.1884%2019.035%2068.1884%2017.216ZM86.2114%2020.089L85.1404%2019.256C84.5794%2020.021%2083.6614%2020.531%2082.5734%2020.531C80.6524%2020.531%2079.3604%2019.154%2079.3604%2017.267V17.233H85.9224C85.9734%2016.995%2086.0244%2016.655%2086.0244%2016.315C86.0244%2014.173%2084.5114%2012.592%2082.1824%2012.592C79.5304%2012.592%2077.8644%2014.615%2077.8644%2017.216C77.8644%2019.715%2079.6494%2021.84%2082.5394%2021.84C84.1374%2021.84%2085.4124%2021.16%2086.2114%2020.089ZM82.1994%2013.833C83.6104%2013.833%2084.5114%2014.853%2084.5624%2016.094H79.4794C79.8194%2014.615%2080.8054%2013.833%2082.1994%2013.833ZM88.4734%2021.5H89.9184V15.567C90.4624%2014.666%2091.2444%2013.952%2092.4854%2013.952C93.8114%2013.952%2094.6614%2014.836%2094.6614%2016.366V21.5H96.1234V16.315C96.1234%2013.884%2094.6954%2012.592%2092.7744%2012.592C91.4994%2012.592%2090.6154%2013.136%2089.9184%2013.901V12.932H88.4734V21.5ZM99.525%2018.627C99.525%2020.718%20100.596%2021.67%20102.5%2021.67C103.112%2021.67%20103.571%2021.602%20103.979%2021.432V20.14C103.656%2020.276%20103.265%2020.344%20102.704%2020.344C101.667%2020.344%20100.987%2019.97%20100.987%2018.627V14.258H103.962V12.932H100.987V10.79H99.525V12.932H97.91V14.258H99.525V18.627ZM106.902%2010.705C107.463%2010.705%20107.905%2010.246%20107.905%209.685C107.905%209.141%20107.463%208.682%20106.902%208.682C106.341%208.682%20105.882%209.141%20105.882%209.685C105.882%2010.246%20106.341%2010.705%20106.902%2010.705ZM106.171%2021.5H107.616V12.932H106.171V21.5ZM109.548%2012.932V14.258H111.163V21.5H112.625V14.258H115.6V12.932H112.625V11.844C112.625%2010.739%20113.288%2010.059%20114.223%2010.059C114.818%2010.059%20115.209%2010.297%20115.515%2010.637L116.416%209.583C115.906%209.09%20115.158%208.75%20114.206%208.75C112.37%208.75%20111.163%2010.042%20111.163%2011.878V12.932H109.548ZM118.091%2010.705C118.652%2010.705%20119.094%2010.246%20119.094%209.685C119.094%209.141%20118.652%208.682%20118.091%208.682C117.53%208.682%20117.071%209.141%20117.071%209.685C117.071%2010.246%20117.53%2010.705%20118.091%2010.705ZM117.36%2021.5H118.805V12.932H117.36V21.5ZM129.475%2020.089L128.404%2019.256C127.843%2020.021%20126.925%2020.531%20125.837%2020.531C123.916%2020.531%20122.624%2019.154%20122.624%2017.267V17.233H129.186C129.237%2016.995%20129.288%2016.655%20129.288%2016.315C129.288%2014.173%20127.775%2012.592%20125.446%2012.592C122.794%2012.592%20121.128%2014.615%20121.128%2017.216C121.128%2019.715%20122.913%2021.84%20125.803%2021.84C127.401%2021.84%20128.676%2021.16%20129.475%2020.089ZM125.463%2013.833C126.874%2013.833%20127.775%2014.853%20127.826%2016.094H122.743C123.083%2014.615%20124.069%2013.833%20125.463%2013.833ZM131.737%2021.5H133.182V15.686C133.709%2014.819%20134.44%2014.241%20135.562%2014.241C135.902%2014.241%20136.157%2014.292%20136.412%2014.36V12.864C136.208%2012.796%20135.953%2012.762%20135.681%2012.762C134.593%2012.762%20133.811%2013.255%20133.182%2014.003V12.932H131.737V21.5ZM145.422%2021.84C146.578%2021.84%20147.649%2021.313%20148.295%2020.412V21.5H149.74V15.754C149.74%2013.867%20148.448%2012.592%20146.272%2012.592C144.776%2012.592%20143.569%2013.221%20142.821%2014.241L143.909%2015.074C144.402%2014.326%20145.235%2013.884%20146.238%2013.884C147.445%2013.884%20148.295%2014.564%20148.295%2015.754V16.349L145.422%2016.825C143.586%2017.114%20142.6%2018.066%20142.6%2019.392C142.6%2020.888%20143.739%2021.84%20145.422%2021.84ZM144.045%2019.341C144.045%2018.593%20144.572%2018.049%20145.762%2017.862L148.295%2017.42V19.052C147.7%2020.038%20146.799%2020.633%20145.66%2020.633C144.674%2020.633%20144.045%2020.072%20144.045%2019.341ZM151.297%2012.932L154.646%2021.5H156.55L159.899%2012.932H158.335L155.598%2019.987L152.861%2012.932H151.297ZM169.153%2020.089L168.082%2019.256C167.521%2020.021%20166.603%2020.531%20165.515%2020.531C163.594%2020.531%20162.302%2019.154%20162.302%2017.267V17.233H168.864C168.915%2016.995%20168.966%2016.655%20168.966%2016.315C168.966%2014.173%20167.453%2012.592%20165.124%2012.592C162.472%2012.592%20160.806%2014.615%20160.806%2017.216C160.806%2019.715%20162.591%2021.84%20165.481%2021.84C167.079%2021.84%20168.354%2021.16%20169.153%2020.089ZM165.141%2013.833C166.552%2013.833%20167.453%2014.853%20167.504%2016.094H162.421C162.761%2014.615%20163.747%2013.833%20165.141%2013.833ZM175.326%2020.48C173.473%2020.48%20172.164%2019.052%20172.164%2017.216C172.164%2015.397%20173.473%2013.952%20175.309%2013.952C176.363%2013.952%20177.23%2014.462%20177.757%2015.227L178.913%2014.343C178.114%2013.289%20176.856%2012.592%20175.309%2012.592C172.47%2012.592%20170.651%2014.717%20170.651%2017.216C170.651%2019.715%20172.47%2021.84%20175.309%2021.84C176.873%2021.84%20178.114%2021.16%20178.913%2020.089L177.757%2019.205C177.23%2019.97%20176.38%2020.48%20175.326%2020.48Z%22%20fill%3D%22white%22%2F%3E%3Cpath%20d%3D%22M49.06%2042.5V28.5H52.64L56.02%2034.26L59.4%2028.5H62.98V42.5H60.14V32.54L57.02%2037.7H55.02L51.9%2032.54V42.5H49.06ZM71.2106%2032.02C72.024%2032.02%2072.7706%2032.1667%2073.4506%2032.46C74.1306%2032.74%2074.7106%2033.1267%2075.1906%2033.62C75.684%2034.1%2076.064%2034.6733%2076.3306%2035.34C76.5973%2036.0067%2076.7306%2036.7133%2076.7306%2037.46C76.7306%2038.2067%2076.5973%2038.9133%2076.3306%2039.58C76.064%2040.2467%2075.684%2040.8267%2075.1906%2041.32C74.7106%2041.8%2074.1306%2042.1867%2073.4506%2042.48C72.7706%2042.76%2072.024%2042.9%2071.2106%2042.9C70.3973%2042.9%2069.6506%2042.76%2068.9706%2042.48C68.2906%2042.1867%2067.704%2041.8%2067.2106%2041.32C66.7306%2040.8267%2066.3573%2040.2467%2066.0906%2039.58C65.824%2038.9133%2065.6906%2038.2067%2065.6906%2037.46C65.6906%2036.7133%2065.824%2036.0067%2066.0906%2035.34C66.3573%2034.6733%2066.7306%2034.1%2067.2106%2033.62C67.704%2033.1267%2068.2906%2032.74%2068.9706%2032.46C69.6506%2032.1667%2070.3973%2032.02%2071.2106%2032.02ZM71.2506%2040.5C72.0506%2040.5%2072.724%2040.2133%2073.2706%2039.64C73.8173%2039.0533%2074.0906%2038.3267%2074.0906%2037.46C74.0906%2036.58%2073.8173%2035.8533%2073.2706%2035.28C72.724%2034.7067%2072.0506%2034.42%2071.2506%2034.42C70.4106%2034.42%2069.7106%2034.7067%2069.1506%2035.28C68.604%2035.8533%2068.3306%2036.58%2068.3306%2037.46C68.3306%2038.34%2068.604%2039.0667%2069.1506%2039.64C69.7106%2040.2133%2070.4106%2040.5%2071.2506%2040.5ZM79.0473%2042.5V32.42H81.5873V33.22C81.934%2032.8867%2082.3473%2032.6067%2082.8273%2032.38C83.3207%2032.14%2083.9007%2032.02%2084.5673%2032.02C85.114%2032.02%2085.6207%2032.1133%2086.0873%2032.3C86.5673%2032.4867%2086.9807%2032.7667%2087.3273%2033.14C87.6873%2033.5133%2087.9673%2033.98%2088.1673%2034.54C88.3807%2035.1%2088.4873%2035.7533%2088.4873%2036.5V42.5H85.9073V36.6C85.9073%2035.9333%2085.7273%2035.4067%2085.3673%2035.02C85.0207%2034.62%2084.5407%2034.42%2083.9273%2034.42C83.2873%2034.42%2082.7807%2034.5933%2082.4073%2034.94C82.0473%2035.2733%2081.774%2035.6%2081.5873%2035.92V42.5H79.0473ZM98.1516%2040.24C98.9516%2040.24%2099.6582%2040.0667%20100.272%2039.72C100.898%2039.36%20101.412%2038.8933%20101.812%2038.32L104.052%2040.04C103.412%2040.9067%20102.585%2041.6%20101.572%2042.12C100.558%2042.64%2099.4182%2042.9%2098.1516%2042.9C97.0582%2042.9%2096.0516%2042.7%2095.1316%2042.3C94.2116%2041.9%2093.4249%2041.3667%2092.7716%2040.7C92.1182%2040.0333%2091.6116%2039.2533%2091.2516%2038.36C90.8916%2037.4533%2090.7116%2036.5%2090.7116%2035.5C90.7116%2034.5%2090.8916%2033.5533%2091.2516%2032.66C91.6116%2031.7533%2092.1182%2030.9667%2092.7716%2030.3C93.4249%2029.6333%2094.2116%2029.1%2095.1316%2028.7C96.0516%2028.3%2097.0582%2028.1%2098.1516%2028.1C99.4182%2028.1%20100.558%2028.3667%20101.572%2028.9C102.585%2029.42%20103.412%2030.1%20104.052%2030.94L101.812%2032.68C101.412%2032.1067%20100.898%2031.6467%20100.272%2031.3C99.6582%2030.94%2098.9516%2030.76%2098.1516%2030.76C97.4982%2030.76%2096.8916%2030.8867%2096.3316%2031.14C95.7716%2031.38%2095.2916%2031.7133%2094.8916%2032.14C94.5049%2032.5533%2094.1982%2033.0533%2093.9716%2033.64C93.7449%2034.2133%2093.6316%2034.8333%2093.6316%2035.5C93.6316%2036.1667%2093.7449%2036.7933%2093.9716%2037.38C94.1982%2037.9533%2094.5049%2038.4533%2094.8916%2038.88C95.2916%2039.2933%2095.7716%2039.6267%2096.3316%2039.88C96.8916%2040.12%2097.4982%2040.24%2098.1516%2040.24ZM110.781%2032.02C111.594%2032.02%20112.341%2032.1667%20113.021%2032.46C113.701%2032.74%20114.281%2033.1267%20114.761%2033.62C115.254%2034.1%20115.634%2034.6733%20115.901%2035.34C116.168%2036.0067%20116.301%2036.7133%20116.301%2037.46C116.301%2038.2067%20116.168%2038.9133%20115.901%2039.58C115.634%2040.2467%20115.254%2040.8267%20114.761%2041.32C114.281%2041.8%20113.701%2042.1867%20113.021%2042.48C112.341%2042.76%20111.594%2042.9%20110.781%2042.9C109.968%2042.9%20109.221%2042.76%20108.541%2042.48C107.861%2042.1867%20107.274%2041.8%20106.781%2041.32C106.301%2040.8267%20105.928%2040.2467%20105.661%2039.58C105.394%2038.9133%20105.261%2038.2067%20105.261%2037.46C105.261%2036.7133%20105.394%2036.0067%20105.661%2035.34C105.928%2034.6733%20106.301%2034.1%20106.781%2033.62C107.274%2033.1267%20107.861%2032.74%20108.541%2032.46C109.221%2032.1667%20109.968%2032.02%20110.781%2032.02ZM110.821%2040.5C111.621%2040.5%20112.294%2040.2133%20112.841%2039.64C113.388%2039.0533%20113.661%2038.3267%20113.661%2037.46C113.661%2036.58%20113.388%2035.8533%20112.841%2035.28C112.294%2034.7067%20111.621%2034.42%20110.821%2034.42C109.981%2034.42%20109.281%2034.7067%20108.721%2035.28C108.174%2035.8533%20107.901%2036.58%20107.901%2037.46C107.901%2038.34%20108.174%2039.0667%20108.721%2039.64C109.281%2040.2133%20109.981%2040.5%20110.821%2040.5ZM118.618%2042.5V32.42H121.158V33.18C121.491%2032.8467%20121.884%2032.5733%20122.338%2032.36C122.791%2032.1333%20123.324%2032.02%20123.938%2032.02C124.591%2032.02%20125.191%2032.1733%20125.738%2032.48C126.298%2032.7733%20126.744%2033.2067%20127.078%2033.78C127.451%2033.3267%20127.898%2032.92%20128.418%2032.56C128.938%2032.2%20129.591%2032.02%20130.378%2032.02C130.898%2032.02%20131.384%2032.1133%20131.838%2032.3C132.291%2032.4733%20132.684%2032.74%20133.018%2033.1C133.351%2033.4467%20133.611%2033.8933%20133.798%2034.44C133.998%2034.9733%20134.098%2035.5933%20134.098%2036.3V42.5H131.538V36.4C131.538%2035.7867%20131.378%2035.3067%20131.058%2034.96C130.751%2034.6%20130.311%2034.42%20129.738%2034.42C129.204%2034.42%20128.771%2034.58%20128.438%2034.9C128.104%2035.2067%20127.838%2035.5267%20127.638%2035.86C127.651%2035.9267%20127.658%2036%20127.658%2036.08C127.658%2036.16%20127.658%2036.2333%20127.658%2036.3V42.5H125.078V36.4C125.078%2035.7867%20124.924%2035.3067%20124.618%2034.96C124.311%2034.6%20123.871%2034.42%20123.298%2034.42C122.724%2034.42%20122.271%2034.5933%20121.938%2034.94C121.604%2035.2733%20121.344%2035.6%20121.158%2035.92V42.5H118.618ZM136.997%2047.42V32.42H139.537V33.14C139.937%2032.78%20140.397%2032.5067%20140.917%2032.32C141.437%2032.12%20142.023%2032.02%20142.677%2032.02C143.477%2032.02%20144.19%2032.1667%20144.817%2032.46C145.457%2032.7533%20145.997%2033.1467%20146.437%2033.64C146.877%2034.1333%20147.21%2034.7133%20147.437%2035.38C147.677%2036.0333%20147.797%2036.7267%20147.797%2037.46C147.797%2038.1933%20147.677%2038.8933%20147.437%2039.56C147.21%2040.2133%20146.877%2040.7867%20146.437%2041.28C145.997%2041.7733%20145.457%2042.1667%20144.817%2042.46C144.19%2042.7533%20143.477%2042.9%20142.677%2042.9C142.023%2042.9%20141.437%2042.8%20140.917%2042.6C140.397%2042.4133%20139.937%2042.14%20139.537%2041.78V47.42H136.997ZM139.557%2038.98C139.89%2039.4733%20140.283%2039.8533%20140.737%2040.12C141.203%2040.3733%20141.73%2040.5%20142.317%2040.5C143.17%2040.5%20143.857%2040.2133%20144.377%2039.64C144.897%2039.0667%20145.157%2038.34%20145.157%2037.46C145.157%2036.58%20144.897%2035.8533%20144.377%2035.28C143.857%2034.7067%20143.17%2034.42%20142.317%2034.42C141.73%2034.42%20141.203%2034.5533%20140.737%2034.82C140.283%2035.0733%20139.89%2035.4467%20139.557%2035.94L139.537%2035.92V39L139.557%2038.98ZM150.644%2038.82V34.74H148.764V32.42H150.644V29.9H153.204V32.42H156.284V34.74H153.204V38.82C153.204%2039.38%20153.344%2039.78%20153.624%2040.02C153.918%2040.26%20154.311%2040.38%20154.804%2040.38C155.151%2040.38%20155.444%2040.36%20155.684%2040.32C155.924%2040.28%20156.131%2040.2267%20156.304%2040.16V42.38C156.051%2042.4867%20155.764%2042.5667%20155.444%2042.62C155.138%2042.6733%20154.778%2042.7%20154.364%2042.7C153.111%2042.7%20152.178%2042.36%20151.564%2041.68C150.951%2041%20150.644%2040.0467%20150.644%2038.82ZM167.644%2040.86C167.177%2041.4867%20166.564%2041.9867%20165.804%2042.36C165.044%2042.72%20164.19%2042.9%20163.244%2042.9C162.35%2042.9%20161.55%2042.7533%20160.844%2042.46C160.15%2042.1667%20159.564%2041.7733%20159.084%2041.28C158.617%2040.7867%20158.257%2040.2133%20158.004%2039.56C157.764%2038.8933%20157.644%2038.1933%20157.644%2037.46C157.644%2036.7133%20157.757%2036.0133%20157.984%2035.36C158.224%2034.6933%20158.564%2034.1133%20159.004%2033.62C159.444%2033.1267%20159.984%2032.74%20160.624%2032.46C161.264%2032.1667%20161.997%2032.02%20162.824%2032.02C164.21%2032.02%20165.33%2032.4467%20166.184%2033.3C167.037%2034.14%20167.464%2035.22%20167.464%2036.54C167.464%2036.82%20167.444%2037.0867%20167.404%2037.34C167.377%2037.5933%20167.344%2037.8067%20167.304%2037.98H160.244C160.324%2038.8067%20160.637%2039.4533%20161.184%2039.92C161.73%2040.3867%20162.43%2040.62%20163.284%2040.62C163.83%2040.62%20164.324%2040.5133%20164.764%2040.3C165.204%2040.0733%20165.557%2039.78%20165.824%2039.42L167.644%2040.86ZM162.824%2034.14C162.21%2034.14%20161.697%2034.3%20161.284%2034.62C160.87%2034.9267%20160.577%2035.4067%20160.404%2036.06H164.944C164.93%2035.5667%20164.737%2035.1267%20164.364%2034.74C164.004%2034.34%20163.49%2034.14%20162.824%2034.14ZM170.486%2042.5V28.5H175.106C176.639%2028.5%20177.846%2028.8733%20178.726%2029.62C179.619%2030.3667%20180.066%2031.3867%20180.066%2032.68C180.066%2033.96%20179.619%2034.9733%20178.726%2035.72C177.846%2036.4667%20176.639%2036.84%20175.106%2036.84H173.326V42.5H170.486ZM175.226%2030.92H173.326V34.42H175.226C175.826%2034.42%20176.292%2034.2667%20176.626%2033.96C176.972%2033.6533%20177.146%2033.2133%20177.146%2032.64C177.146%2032.1067%20176.972%2031.6867%20176.626%2031.38C176.292%2031.0733%20175.826%2030.92%20175.226%2030.92ZM182.036%2042.5V32.42H184.576V33.42C184.909%2033.0867%20185.289%2032.8067%20185.716%2032.58C186.156%2032.34%20186.662%2032.22%20187.236%2032.22C187.409%2032.22%20187.569%2032.2333%20187.716%2032.26C187.862%2032.2867%20187.996%2032.32%20188.116%2032.36V35.02C187.956%2034.98%20187.782%2034.9467%20187.596%2034.92C187.422%2034.8933%20187.222%2034.88%20186.996%2034.88C186.382%2034.88%20185.869%2035.02%20185.456%2035.3C185.056%2035.58%20184.762%2035.8733%20184.576%2036.18V42.5H182.036ZM194.687%2032.02C195.501%2032.02%20196.247%2032.1667%20196.927%2032.46C197.607%2032.74%20198.187%2033.1267%20198.667%2033.62C199.161%2034.1%20199.541%2034.6733%20199.807%2035.34C200.074%2036.0067%20200.207%2036.7133%20200.207%2037.46C200.207%2038.2067%20200.074%2038.9133%20199.807%2039.58C199.541%2040.2467%20199.161%2040.8267%20198.667%2041.32C198.187%2041.8%20197.607%2042.1867%20196.927%2042.48C196.247%2042.76%20195.501%2042.9%20194.687%2042.9C193.874%2042.9%20193.127%2042.76%20192.447%2042.48C191.767%2042.1867%20191.181%2041.8%20190.687%2041.32C190.207%2040.8267%20189.834%2040.2467%20189.567%2039.58C189.301%2038.9133%20189.167%2038.2067%20189.167%2037.46C189.167%2036.7133%20189.301%2036.0067%20189.567%2035.34C189.834%2034.6733%20190.207%2034.1%20190.687%2033.62C191.181%2033.1267%20191.767%2032.74%20192.447%2032.46C193.127%2032.1667%20193.874%2032.02%20194.687%2032.02ZM194.727%2040.5C195.527%2040.5%20196.201%2040.2133%20196.747%2039.64C197.294%2039.0533%20197.567%2038.3267%20197.567%2037.46C197.567%2036.58%20197.294%2035.8533%20196.747%2035.28C196.201%2034.7067%20195.527%2034.42%20194.727%2034.42C193.887%2034.42%20193.187%2034.7067%20192.627%2035.28C192.081%2035.8533%20191.807%2036.58%20191.807%2037.46C191.807%2038.34%20192.081%2039.0667%20192.627%2039.64C193.187%2040.2133%20193.887%2040.5%20194.727%2040.5Z%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E); +} diff --git a/views/index.ejs b/views/index.ejs deleted file mode 100644 index e9e1910..0000000 --- a/views/index.ejs +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - <%= locals.title %> - - - - -

<%= locals.title %>

-

Se connecter

- - <% if (locals.userinfo) { %> -

Information utilisateur

-
<%= locals.userinfo %>
- <% } %> - <% if (locals.idtoken) { %> -

ID Token

-
<%= locals.idtoken %>
- <% } %> - <% if (locals.oauth2token) { %> -

OAuth2 Token

-
<%= locals.oauth2token %>
- <% } %> -

Interactions

-
- -
-
-
- -
-
-
- -
-
-
- -
-
- - - diff --git a/views/index.ts b/views/index.ts new file mode 100644 index 0000000..d8125f8 --- /dev/null +++ b/views/index.ts @@ -0,0 +1,90 @@ +// + +import { html } from "hono/html"; +import { readFile } from "node:fs/promises"; +import type { IdTokenClaims, TokenSet } from "openid-client"; + +// + +const critical_css = await readFile(import.meta.resolveSync("./critical.css")); + +// + +export function Index(locals: { + title: string; + stylesheet_url: string; + userinfo: string; + idtoken: IdTokenClaims; + oauth2token: TokenSet; +}) { + const user_info = locals.userinfo + ? html`

Information utilisateur

+
${JSON.stringify(locals.userinfo, null, 2)}
` + : ""; + const idtoken = locals.idtoken + ? html`

ID Token

+
${JSON.stringify(locals.idtoken, null, 2)}
` + : ""; + const oauth2token = locals.oauth2token + ? html`

OAuth2 Token

+
${JSON.stringify(locals.oauth2token, null, 2)}
` + : ""; + + return html` + + + + + ${locals.title} + + + + +

${locals.title}

+

Se connecter

+ + ${user_info} ${idtoken} ${oauth2token} +

Interactions

+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ + + `; +} From 6980beac6bfb295038d0185aa122797c6cce1957 Mon Sep 17 00:00:00 2001 From: Douglas DUTEIL Date: Thu, 14 Dec 2023 20:46:50 +0100 Subject: [PATCH 2/3] chore(tsc): explicit files --- tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 3a362c4..8089dd4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,5 +2,6 @@ "extends": "@tsconfig/bun/tsconfig.json", "compilerOptions": { "verbatimModuleSyntax": true - } + }, + "files": ["./index.ts", "./views/index.ts"] } From 2a70ef5559de527dd30d96131774022c80ac9044 Mon Sep 17 00:00:00 2001 From: Douglas DUTEIL Date: Fri, 22 Dec 2023 10:35:45 +0100 Subject: [PATCH 3/3] chore: raph suggestion --- .env | 8 ++++++++ README.md | 6 +++--- index.ts | 3 ++- tsconfig.json | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/.env b/.env index 4d982c0..1aed835 100644 --- a/.env +++ b/.env @@ -1,4 +1,12 @@ +CALLBACK_URL: /login-callback HOST: http://localhost:3000 +LOGIN_HINT: "" MCP_CLIENT_ID: client_id MCP_CLIENT_SECRET: client_secret +MCP_ID_TOKEN_SIGNED_RESPONSE_ALG: RS256 MCP_PROVIDER: https://app-test.moncomptepro.beta.gouv.fr/ +MCP_SCOPES: "openid email profile organization" +MCP_USERINFO_SIGNED_RESPONSE_ALG: "" +PORT: 3000 +SITE_TITLE: "Bonjour monde !" +STYLESHEET_URL: https://unpkg.com/bamboo.css diff --git a/README.md b/README.md index 059b5b4..7cb130f 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ This tool is full configured using environment variables. Pull the image: ``` -docker pull rdubigny/moncomptepro-test-client +docker pull ghcr.io/betagouv/moncomptepro-test-client ``` Run the container: @@ -24,7 +24,7 @@ Run the container: docker run -d --rm \ -p 3000:3000 \ -e PORT=3000 \ -rdubigny/moncomptepro-test-client +ghcr.io/betagouv/moncomptepro-test-client ``` ## Run it with Docker Compose @@ -36,7 +36,7 @@ version: "3.5" services: oidc-test-client: - image: rdubigny/moncomptepro-test-client + image: ghcr.io/betagouv/moncomptepro-test-client ports: - 3000:3000 environment: diff --git a/index.ts b/index.ts index 84831ca..216a8b8 100644 --- a/index.ts +++ b/index.ts @@ -29,7 +29,7 @@ const env = z MCP_SCOPES: z.string().default("openid email profile organization"), MCP_USERINFO_SIGNED_RESPONSE_ALG: z.string().optional(), PORT: z.coerce.number().default(3000), - SITE_TITLE: z.string().default("Bonjour monde !"), + SITE_TITLE: z.string().default("Bonjour monde !"), STYLESHEET_URL: z.string().default("https://unpkg.com/bamboo.css"), }) .parse(process_env); @@ -55,6 +55,7 @@ interface Session_Context extends Env { }; }; } + const hono = new Hono(); // diff --git a/tsconfig.json b/tsconfig.json index 8089dd4..57886a0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,5 +3,5 @@ "compilerOptions": { "verbatimModuleSyntax": true }, - "files": ["./index.ts", "./views/index.ts"] + "files": ["./index.ts"] }