[{"data":1,"prerenderedAt":753},["ShallowReactive",2],{"doc:\u002Freverse-proxy\u002Foperations\u002Fsecurity":3,"surround:\u002Freverse-proxy\u002Foperations\u002Fsecurity":502,"navigation":513},{"id":4,"title":5,"body":6,"description":495,"extension":496,"meta":497,"navigation":341,"path":498,"seo":499,"stem":500,"__hash__":501},"docs\u002F02.reverse-proxy\u002F05.operations\u002F03.security.md","Bezpieczeństwo",{"type":7,"value":8,"toc":484},"minimark",[9,14,18,22,45,91,95,105,146,149,153,156,178,189,193,221,225,271,274,278,281,308,373,377,409,420,424,469,480],[10,11,13],"h2",{"id":12},"model-bezpieczeństwa","Model bezpieczeństwa",[15,16,17],"p",{},"Proxy jest projektowane z założeniem, że stoi na granicy sieci — każda warstwa ma bezpieczny default.",[10,19,21],{"id":20},"admin-api-fail-closed","Admin API: fail-closed",[23,24,25,39,42],"ul",{},[26,27,28,29,33,34,38],"li",{},"Bearer token z ",[30,31,32],"code",{},"ADMIN_TOKEN",", porównanie ",[35,36,37],"strong",{},"constant-time",".",[26,40,41],{},"Bez tokenu API nie istnieje — nie ma „pustego hasła”.",[26,43,44],{},"Security headers na odpowiedziach admina.",[46,47,52],"pre",{"className":48,"code":49,"language":50,"meta":51,"style":51},"language-bash shiki shiki-themes github-light github-dark","export ADMIN_TOKEN=$(openssl rand -hex 32)\n","bash","",[30,53,54],{"__ignoreMap":51},[55,56,59,63,67,70,73,77,81,85,88],"span",{"class":57,"line":58},"line",1,[55,60,62],{"class":61},"szBVR","export",[55,64,66],{"class":65},"sVt8B"," ADMIN_TOKEN",[55,68,69],{"class":61},"=",[55,71,72],{"class":65},"$(",[55,74,76],{"class":75},"sScJk","openssl",[55,78,80],{"class":79},"sZZnC"," rand",[55,82,84],{"class":83},"sj4cs"," -hex",[55,86,87],{"class":83}," 32",[55,89,90],{"class":65},")\n",[10,92,94],{"id":93},"client-ip-i-trusted-proxies","Client IP i trusted proxies",[15,96,97,100,101,104],{},[30,98,99],{},"X-Forwarded-For"," jest wiarygodny ",[35,102,103],{},"tylko"," od zaufanych pośredników:",[46,106,110],{"className":107,"code":108,"language":109,"meta":51,"style":51},"language-yaml shiki shiki-themes github-light github-dark","rate_limit:\n  trusted_proxies:\n    - 10.0.0.0\u002F8\n    - 172.16.0.0\u002F12\n","yaml",[30,111,112,121,129,138],{"__ignoreMap":51},[55,113,114,118],{"class":57,"line":58},[55,115,117],{"class":116},"s9eBZ","rate_limit",[55,119,120],{"class":65},":\n",[55,122,124,127],{"class":57,"line":123},2,[55,125,126],{"class":116},"  trusted_proxies",[55,128,120],{"class":65},[55,130,132,135],{"class":57,"line":131},3,[55,133,134],{"class":65},"    - ",[55,136,137],{"class":79},"10.0.0.0\u002F8\n",[55,139,141,143],{"class":57,"line":140},4,[55,142,134],{"class":65},[55,144,145],{"class":79},"172.16.0.0\u002F12\n",[15,147,148],{},"Bez tej konfiguracji client-supplied forwarding headers są ignorowane, a używany jest socket address. Chroni to przed spoofingiem IP w rate limitingu i logach.",[10,150,152],{"id":151},"walidacja-url-backendów","Walidacja URL backendów",[15,154,155],{},"Konfiguracja odrzuca backend URL z:",[23,157,158,165,171],{},[26,159,160,161,164],{},"credentials (",[30,162,163],{},"http:\u002F\u002Fuser:pass@host","),",[26,166,167,168,164],{},"query string (",[30,169,170],{},"?x=1",[26,172,173,174,177],{},"fragmentem (",[30,175,176],{},"#frag",").",[15,179,180,181,184,185,188],{},"Dozwolone są tylko ",[30,182,183],{},"http"," i ",[30,186,187],{},"https"," z hostem.",[10,190,192],{"id":191},"hop-by-hop-headers","Hop-by-hop headers",[15,194,195,196,199,200,199,203,199,206,199,209,199,212,199,215,199,218,38],{},"Nagłówki hop-by-hop są stripowane z requestów do upstreamu zgodnie z RFC 7230: ",[30,197,198],{},"Connection",", ",[30,201,202],{},"Keep-Alive",[30,204,205],{},"Proxy-Authenticate",[30,207,208],{},"Proxy-Authorization",[30,210,211],{},"TE",[30,213,214],{},"Trailer",[30,216,217],{},"Transfer-Encoding",[30,219,220],{},"Upgrade",[10,222,224],{"id":223},"sekrety","Sekrety",[226,227,228,240],"table",{},[229,230,231],"thead",{},[232,233,234,237],"tr",{},[235,236,224],"th",{},[235,238,239],{},"Gdzie",[241,242,243,253,262],"tbody",{},[232,244,245,250],{},[246,247,248],"td",{},[30,249,32],{},[246,251,252],{},"environment",[232,254,255,260],{},[246,256,257],{},[30,258,259],{},"REDIS_PASSWORD",[246,261,252],{},[232,263,264,269],{},[246,265,266],{},[30,267,268],{},"GRAFANA_ADMIN_PASSWORD",[246,270,252],{},[15,272,273],{},"Nigdy w YAML, nigdy w obrazie kontenera, nigdy w logach.",[10,275,277],{"id":276},"utwardzony-kontener","Utwardzony kontener",[15,279,280],{},"Obraz Docker:",[23,282,283,289,295,300,305],{},[26,284,285,288],{},[35,286,287],{},"multi-stage build"," — kompilator nie trafia do runtime,",[26,290,291,294],{},[35,292,293],{},"non-root user",",",[26,296,297,294],{},[35,298,299],{},"read-only root filesystem",[26,301,302,294],{},[35,303,304],{},"dropped capabilities",[26,306,307],{},"certyfikaty TLS montowane read-only.",[46,309,314],{"className":310,"code":311,"filename":312,"language":313,"meta":51,"style":51},"language-dockerfile shiki shiki-themes github-light github-dark","FROM golang:1.26-alpine AS build\nWORKDIR \u002Fsrc\nCOPY . .\nRUN CGO_ENABLED=0 go build -ldflags=\"-s -w\" -o \u002Fproxy .\u002Fcmd\u002Fserver\n\nFROM gcr.io\u002Fdistroless\u002Fstatic-debian12:nonroot\nCOPY --from=build \u002Fproxy \u002Fproxy\nUSER nonroot:nonroot\nEXPOSE 8080\nENTRYPOINT [\"\u002Fproxy\"]\n","Dockerfile","dockerfile",[30,315,316,321,326,331,336,343,349,355,361,367],{"__ignoreMap":51},[55,317,318],{"class":57,"line":58},[55,319,320],{},"FROM golang:1.26-alpine AS build\n",[55,322,323],{"class":57,"line":123},[55,324,325],{},"WORKDIR \u002Fsrc\n",[55,327,328],{"class":57,"line":131},[55,329,330],{},"COPY . .\n",[55,332,333],{"class":57,"line":140},[55,334,335],{},"RUN CGO_ENABLED=0 go build -ldflags=\"-s -w\" -o \u002Fproxy .\u002Fcmd\u002Fserver\n",[55,337,339],{"class":57,"line":338},5,[55,340,342],{"emptyLinePlaceholder":341},true,"\n",[55,344,346],{"class":57,"line":345},6,[55,347,348],{},"FROM gcr.io\u002Fdistroless\u002Fstatic-debian12:nonroot\n",[55,350,352],{"class":57,"line":351},7,[55,353,354],{},"COPY --from=build \u002Fproxy \u002Fproxy\n",[55,356,358],{"class":57,"line":357},8,[55,359,360],{},"USER nonroot:nonroot\n",[55,362,364],{"class":57,"line":363},9,[55,365,366],{},"EXPOSE 8080\n",[55,368,370],{"class":57,"line":369},10,[55,371,372],{},"ENTRYPOINT [\"\u002Fproxy\"]\n",[10,374,376],{"id":375},"tls","TLS",[46,378,380],{"className":107,"code":379,"language":109,"meta":51,"style":51},"tls:\n  cert_file: \u002Fetc\u002Ftls\u002Fserver.crt\n  key_file: \u002Fetc\u002Ftls\u002Fserver.key\n",[30,381,382,388,399],{"__ignoreMap":51},[55,383,384,386],{"class":57,"line":58},[55,385,375],{"class":116},[55,387,120],{"class":65},[55,389,390,393,396],{"class":57,"line":123},[55,391,392],{"class":116},"  cert_file",[55,394,395],{"class":65},": ",[55,397,398],{"class":79},"\u002Fetc\u002Ftls\u002Fserver.crt\n",[55,400,401,404,406],{"class":57,"line":131},[55,402,403],{"class":116},"  key_file",[55,405,395],{"class":65},[55,407,408],{"class":79},"\u002Fetc\u002Ftls\u002Fserver.key\n",[23,410,411,414,417],{},[26,412,413],{},"Oba pliki muszą istnieć — inaczej proxy odmawia startu.",[26,415,416],{},"TLS 1.2+.",[26,418,419],{},"Certyfikaty montuj read-only.",[10,421,423],{"id":422},"checklist-produkcyjny","Checklist produkcyjny",[425,426,427],"steps",{},[428,429,430,436,443,453,456,459,462],"ol",{},[26,431,432,433,435],{},"Ustaw silny ",[30,434,32],{}," (32+ bajty losowości).",[26,437,438,439,442],{},"Skonfiguruj ",[30,440,441],{},"rate_limit.trusted_proxies"," dla swojego LB\u002FCDN.",[26,444,445,446,184,449,452],{},"Ogranicz ",[30,447,448],{},"\u002Fadmin\u002F*",[30,450,451],{},"\u002Fmetrics"," do sieci wewnętrznej.",[26,454,455],{},"Włącz TLS termination na proxy lub przed nim.",[26,457,458],{},"Uruchom kontener jako non-root z read-only FS.",[26,460,461],{},"Zostaw retry domyślne — nie ponawiaj requestów z body.",[26,463,464,465,468],{},"Monitoruj ",[30,466,467],{},"rate_limit_errors_total"," (fail-open Redis).",[470,471,474],"callout",{"title":472,"type":473},"Rate limiting fail-open","danger",[15,475,476,477,479],{},"Przy awarii Redis ruch płynie dalej bez limitów (availability over strict limiting). Jeśli potrzebujesz twardego limitu za wszelką cenę, monitoruj ",[30,478,467],{}," i alertuj — to świadomy trade-off, nie przeoczenie.",[481,482,483],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":51,"searchDepth":131,"depth":131,"links":485},[486,487,488,489,490,491,492,493,494],{"id":12,"depth":123,"text":13},{"id":20,"depth":123,"text":21},{"id":93,"depth":123,"text":94},{"id":151,"depth":123,"text":152},{"id":191,"depth":123,"text":192},{"id":223,"depth":123,"text":224},{"id":276,"depth":123,"text":277},{"id":375,"depth":123,"text":376},{"id":422,"depth":123,"text":423},"Fail-closed admin API, trusted proxies, walidacja URL, hop-by-hop headers, sekrety w environment i utwardzony kontener.","md",{},"\u002Freverse-proxy\u002Foperations\u002Fsecurity",{"title":5,"description":495},"02.reverse-proxy\u002F05.operations\u002F03.security","CYjgSfjJ_Dfu5K1bVv4OHIFwMasjQXY9VILklLsEsc8",[503,508],{"title":504,"path":505,"stem":506,"description":507,"children":-1},"Metryki i monitoring","\u002Freverse-proxy\u002Foperations\u002Fobservability","02.reverse-proxy\u002F05.operations\u002F02.observability","Strukturalne logi slog, pełna lista metryk Prometheus i gotowy stack Prometheus + Grafana z dashboardem.",{"title":509,"path":510,"stem":511,"description":512,"children":-1},"Wdrożenie","\u002Freverse-proxy\u002Foperations\u002Fdeployment","02.reverse-proxy\u002F05.operations\u002F04.deployment","Docker, Docker Compose, HTTPS termination, rozproszony rate limiting z Redis i graceful shutdown. Gotowe przepisy produkcyjne.",[514,633,686],{"title":515,"path":516,"stem":517,"children":518},"2D Game Engine","\u002Fgame-engine","01.game-engine\u002F01.index",[519,521,525,529,533,559,588,601,622,625,629],{"title":520,"path":516,"stem":517},"Przegląd",{"title":522,"path":523,"stem":524},"Szybki start","\u002Fgame-engine\u002Fgetting-started","01.game-engine\u002F02.getting-started",{"title":526,"path":527,"stem":528},"Konfiguracja","\u002Fgame-engine\u002Fconfiguration","01.game-engine\u002F03.configuration",{"title":530,"path":531,"stem":532},"Architektura","\u002Fgame-engine\u002Farchitecture","01.game-engine\u002F04.architecture",{"title":534,"path":535,"stem":536,"children":537,"page":558},"Rdzeń","\u002Fgame-engine\u002Fcore","01.game-engine\u002F05.core",[538,542,546,550,554],{"title":539,"path":540,"stem":541},"Silnik i cykl życia","\u002Fgame-engine\u002Fcore\u002Fengine","01.game-engine\u002F05.core\u002F01.engine",{"title":543,"path":544,"stem":545},"Czas i pętla gry","\u002Fgame-engine\u002Fcore\u002Ftime","01.game-engine\u002F05.core\u002F02.time",{"title":547,"path":548,"stem":549},"Sceny","\u002Fgame-engine\u002Fcore\u002Fscenes","01.game-engine\u002F05.core\u002F03.scenes",{"title":551,"path":552,"stem":553},"Obiekty i komponenty","\u002Fgame-engine\u002Fcore\u002Fobjects","01.game-engine\u002F05.core\u002F04.objects",{"title":555,"path":556,"stem":557},"Zdarzenia i harmonogram","\u002Fgame-engine\u002Fcore\u002Fevents","01.game-engine\u002F05.core\u002F05.events",false,{"title":560,"path":561,"stem":562,"children":563,"page":558},"Systemy","\u002Fgame-engine\u002Fsystems","01.game-engine\u002F06.systems",[564,568,572,576,580,584],{"title":565,"path":566,"stem":567},"Zasoby (AssetManager)","\u002Fgame-engine\u002Fsystems\u002Fassets","01.game-engine\u002F06.systems\u002F01.assets",{"title":569,"path":570,"stem":571},"Wejście (InputManager)","\u002Fgame-engine\u002Fsystems\u002Finput","01.game-engine\u002F06.systems\u002F02.input",{"title":573,"path":574,"stem":575},"Fizyka (PhysicsManager)","\u002Fgame-engine\u002Fsystems\u002Fphysics","01.game-engine\u002F06.systems\u002F03.physics",{"title":577,"path":578,"stem":579},"Kamera (CameraManager)","\u002Fgame-engine\u002Fsystems\u002Fcamera","01.game-engine\u002F06.systems\u002F04.camera",{"title":581,"path":582,"stem":583},"Audio (AudioManager)","\u002Fgame-engine\u002Fsystems\u002Faudio","01.game-engine\u002F06.systems\u002F05.audio",{"title":585,"path":586,"stem":587},"Tweeny i easing","\u002Fgame-engine\u002Fsystems\u002Ftweens","01.game-engine\u002F06.systems\u002F06.tweens",{"title":589,"path":590,"stem":591,"children":592,"page":558},"Dane i zapisy","\u002Fgame-engine\u002Fdata","01.game-engine\u002F07.data",[593,597],{"title":594,"path":595,"stem":596},"Format projektu","\u002Fgame-engine\u002Fdata\u002Fproject-format","01.game-engine\u002F07.data\u002F01.project-format",{"title":598,"path":599,"stem":600},"Zapisy gry","\u002Fgame-engine\u002Fdata\u002Fsaves","01.game-engine\u002F07.data\u002F02.saves",{"title":602,"path":603,"stem":604,"children":605,"page":558},"Zaawansowane","\u002Fgame-engine\u002Fadvanced","01.game-engine\u002F08.advanced",[606,610,614,618],{"title":607,"path":608,"stem":609},"Pluginy","\u002Fgame-engine\u002Fadvanced\u002Fplugins","01.game-engine\u002F08.advanced\u002F01.plugins",{"title":611,"path":612,"stem":613},"WebAssembly","\u002Fgame-engine\u002Fadvanced\u002Fwasm","01.game-engine\u002F08.advanced\u002F02.wasm",{"title":615,"path":616,"stem":617},"Debugowanie","\u002Fgame-engine\u002Fadvanced\u002Fdebugging","01.game-engine\u002F08.advanced\u002F03.debugging",{"title":619,"path":620,"stem":621},"Wydajność i benchmarki","\u002Fgame-engine\u002Fadvanced\u002Fperformance","01.game-engine\u002F08.advanced\u002F04.performance",{"title":509,"path":623,"stem":624},"\u002Fgame-engine\u002Fdeployment","01.game-engine\u002F09.deployment",{"title":626,"path":627,"stem":628},"Przykłady","\u002Fgame-engine\u002Fexamples","01.game-engine\u002F10.examples",{"title":630,"path":631,"stem":632},"Decyzje architektoniczne","\u002Fgame-engine\u002Fadr","01.game-engine\u002F11.adr",{"title":634,"path":635,"stem":636,"children":637},"Reverse Proxy","\u002Freverse-proxy","02.reverse-proxy\u002F01.index",[638,639,642,645,666],{"title":520,"path":635,"stem":636},{"title":522,"path":640,"stem":641},"\u002Freverse-proxy\u002Fgetting-started","02.reverse-proxy\u002F02.getting-started",{"title":526,"path":643,"stem":644},"\u002Freverse-proxy\u002Fconfiguration","02.reverse-proxy\u002F03.configuration",{"title":646,"path":647,"stem":648,"children":649,"page":558},"Ruch i odporność","\u002Freverse-proxy\u002Ftraffic","02.reverse-proxy\u002F04.traffic",[650,654,658,662],{"title":651,"path":652,"stem":653},"Load balancing","\u002Freverse-proxy\u002Ftraffic\u002Fload-balancing","02.reverse-proxy\u002F04.traffic\u002F01.load-balancing",{"title":655,"path":656,"stem":657},"Health checks","\u002Freverse-proxy\u002Ftraffic\u002Fhealth-checks","02.reverse-proxy\u002F04.traffic\u002F02.health-checks",{"title":659,"path":660,"stem":661},"Circuit breaker i retry","\u002Freverse-proxy\u002Ftraffic\u002Fresilience","02.reverse-proxy\u002F04.traffic\u002F03.resilience",{"title":663,"path":664,"stem":665},"Rate limiting","\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting","02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting",{"title":667,"path":668,"stem":669,"children":670,"page":558},"Operacje i wdrożenie","\u002Freverse-proxy\u002Foperations","02.reverse-proxy\u002F05.operations",[671,675,676,677,678,682],{"title":672,"path":673,"stem":674},"Admin API","\u002Freverse-proxy\u002Foperations\u002Fadmin-api","02.reverse-proxy\u002F05.operations\u002F01.admin-api",{"title":504,"path":505,"stem":506},{"title":5,"path":498,"stem":500},{"title":509,"path":510,"stem":511},{"title":679,"path":680,"stem":681},"Benchmarki","\u002Freverse-proxy\u002Foperations\u002Fbenchmarks","02.reverse-proxy\u002F05.operations\u002F05.benchmarks",{"title":683,"path":684,"stem":685},"Troubleshooting","\u002Freverse-proxy\u002Foperations\u002Ftroubleshooting","02.reverse-proxy\u002F05.operations\u002F06.troubleshooting",{"title":687,"path":688,"stem":689,"children":690},"Vector Engine","\u002Fvector-engine","03.vector-engine\u002F01.index",[691,692,695,716,729,749],{"title":520,"path":688,"stem":689},{"title":522,"path":693,"stem":694},"\u002Fvector-engine\u002Fgetting-started","03.vector-engine\u002F02.getting-started",{"title":696,"path":697,"stem":698,"children":699,"page":558},"Scena","\u002Fvector-engine\u002Fscene","03.vector-engine\u002F03.scene",[700,704,708,712],{"title":701,"path":702,"stem":703},"Format sceny 1.0","\u002Fvector-engine\u002Fscene\u002Fscene-format","03.vector-engine\u002F03.scene\u002F01.scene-format",{"title":705,"path":706,"stem":707},"Obiekty sceny","\u002Fvector-engine\u002Fscene\u002Fobjects","03.vector-engine\u002F03.scene\u002F02.objects",{"title":709,"path":710,"stem":711},"Gradienty i warstwy","\u002Fvector-engine\u002Fscene\u002Fgradients-layers","03.vector-engine\u002F03.scene\u002F03.gradients-layers",{"title":713,"path":714,"stem":715},"Przykłady scen","\u002Fvector-engine\u002Fscene\u002Fexamples","03.vector-engine\u002F03.scene\u002F04.examples",{"title":717,"path":718,"stem":719,"children":720,"page":558},"Eksport","\u002Fvector-engine\u002Fexport","03.vector-engine\u002F04.export",[721,725],{"title":722,"path":723,"stem":724},"Formaty eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-formats","03.vector-engine\u002F04.export\u002F01.export-formats",{"title":726,"path":727,"stem":728},"Proces eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-workflow","03.vector-engine\u002F04.export\u002F02.export-workflow",{"title":730,"path":731,"stem":732,"children":733,"page":558},"Wnętrze silnika","\u002Fvector-engine\u002Finternals","03.vector-engine\u002F05.internals",[734,737,741,745],{"title":530,"path":735,"stem":736},"\u002Fvector-engine\u002Finternals\u002Farchitecture","03.vector-engine\u002F05.internals\u002F01.architecture",{"title":738,"path":739,"stem":740},"WebAssembly i workery","\u002Fvector-engine\u002Finternals\u002Fwasm","03.vector-engine\u002F05.internals\u002F02.wasm",{"title":742,"path":743,"stem":744},"Workspace i panele","\u002Fvector-engine\u002Finternals\u002Fworkspace","03.vector-engine\u002F05.internals\u002F03.workspace",{"title":746,"path":747,"stem":748},"Breakpointy","\u002Fvector-engine\u002Finternals\u002Fbreakpoints","03.vector-engine\u002F05.internals\u002F04.breakpoints",{"title":750,"path":751,"stem":752},"Wdrożenie na Vercel","\u002Fvector-engine\u002Fdeployment","03.vector-engine\u002F06.deployment",1793986308560]