-
Notifications
You must be signed in to change notification settings - Fork 0
/
test.ts
96 lines (70 loc) · 12.9 KB
/
test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// Contexte: on est sur une API et une de nos ressources est une voiture
// On veut pouvoir créer une voiture, la modifier, la supprimer, la récupérer
// Exercices sur les utility types
interface Car {
id: string;
brand: string;
power: number;
model: string;
color: string | undefined;
analyticsId: string | undefined;
createdAt: Date;
updatedAt: Date;
}
// L'objectif du premier exercice dans un premier temps est de créer le type
// correspondant à la récupération de la marque de la voiture et de sa couleur à partir de l'id
// https://www.typescriptlang.org/play?#code/PTAEGEHsDsBcFMAeCBcoangZ1qLBXAJ1H2nlAEEAFASU11PIBNzpItRDstIiBjbJhwkyoAG6QAlrCLwAUCFAB5aOPj5cAB14TJxPoQCX8Yo3FSZXADSgANgENQAW0hNJAM0kmbDvPk2ahJJO3naORnz+hlyEcnKScCbu9gIQ9sQA3nKgoJJMaDhB0ADmANzZoABGhPbQ+XiwRWUV2gDuJmjQ+E6VJuU5Liy2BY0JzTl8kLaQhCNNoAA+IiyeZEz9oLX2tgCesJJ8WDT1hWOLy-Cr8OsVBvD2CEwUsGgAIg-wG-5MH08voO8EOUAL5xRQAGQA5JBKgAreB8fbuUBMfCgQLwJxeYhIEx8A7MWocUjorhYkygBBOTQcbC4FigAzGYi2ciwHaaeSKSaELhYbR1Wq4AAHYU4hkimmiD0kGAZvic6QAjvhmORfLpLOR4PTyFhHJN8KyiKBRZp0vtiPLIXkwWAobjCPjUnTKSYsdBDHYZlgVWzeAgOKzabz1IQOAAVADKeBguCMPFsqqwdtANFsoGSGlAhjE0gpTBtcEIrnwejVYtRmlsBxlcvIgUggUkhlghhTigjNCoaAAqvsa1h1Y4mJA+KBo+jeMRGjoKcGqjBiQPpPZyym5OzOWlCAAhGp1Ch1KDTYgAXga80UAE1p5SOeQABYmT5xBRgV5KUAAOSUEYnSi9uAAASoAAFpKN+ACi74QIIgawBwnKECEsAIHAKLkGI2x5POjiJhosrQHIrK4PYaDgOk+61E8x5TDMoAXlkOTVDRaAAERUOoxTwJAsDsVYtz0bMoDsZUSbwAJcjAuUJE6lUFFUQetFMCeDFMRUrF1BxABK8DQPYRr8YJEzCWgpArAk1zSUAA
type CarBrandAndColor = Pick<Car, "brand" | "color">;
// L'objectif du second exercice est de créer le type correspondant
// à la récupération de la totalité des propriétés de la voiture à partir de l'id sauf
// la date de création et la date de modification
// https://www.typescriptlang.org/play?#code/PTAEGEHsDsBcFMAeCBcoangZ1qLBXAJ1H2nlAEEAFASU11PIBNzpItRDstIiBjbJhwkyoAG6QAlrCLwAUCFAB5aOPj5cAB14TJxPoQCX8Yo3FSZXADSgANgENQAW0hNJAM0kmbDvPk2ahJJO3naORnz+hlyEcnKScCbu9gIQ9sQA3nKgoJJMaDhB0ADmANzZoABGhPbQ+XiwRWUV2gDuJmjQ+E6VJuU5Liy2BY0JzTl8kLaQhCNNoAA+IiyeZEz9oLX2tgCesJJ8WDT1hWOLy-Cr8OsVBvD2CEwUsGgAIg-wG-5MH08voO8EOUAL5xRQAGQA5JBKgAreB8fbuUBMfB4BEwJiYRAmPgHcjYXAsUAGYzEWzkWA7TTkSaELhYbR1WqwBRgAAHYU4hkimmiD0kGGJvlgkFg22khhRgkCkECkkMsEMHGFjl0lnInM06X2xGFkLyeHs+HcbK5PwQ0pJRgFGHguF8FuY5EGHgOtugYLAEMhSFx+KEuAQhCcCSl00IWAAjvhKbwEBwKRwTFwiBwACoAZTwMFwRh4tljWC9oBotlAyQ0oEMYmkJhRBrghFc+D0zvN-ls7v2QvIsvliuVZvTNCoaAAqvsu1hyI7IHxQFnQNoiKBGjp60mqjAOBpJF3xW3i3IqTS0oQAOrSAAW8cBggAvA0mqVQIoAJq8Yin8jXkzyEtXiUUAADklHTRclHHcAAAlQAALSUECAFEzXAQQE1gDgaRDe0EDgK0xAlFhyUcAs9xgOQKVwew0HAdIr1gW8NHvDgnyyHI8jQAAiABmbirAqapanqbiqHUYp4DFATbimGYeMqQt4BknI2g6UAACZeIANkEnItl2fZDmOHiAEYtIAFhU5xXHgYZQG4jSAAZtJk4Fyio+0qjohibzvD42NADjclEjTrOEuoeIAJXgaBjVsWBrMmCM0FIFYEmuPTl0gdpZlACyAFZdIqAy9gOI5RPM3irKywY7J4izwTcoA
type CarWithoutDates = Omit<Car, "createdAt" | "updatedAt">;
// L'objectif du troisième exercice est de créer le type correspondant à la récupération des données mais
// comme c'est une lecture, on ne veut pas que ces propriétés soient modifiables
// https://www.typescriptlang.org/play?#code/PTAEGEHsDsBcFMAeCBcoangZ1qLBXAJ1H2nlAEEAFASU11PIBNzpItRDstIiBjbJhwkyoAG6QAlrCLwAUCFAB5aOPj5cAB14TJxPoQCX8Yo3FSZXADSgANgENQAW0hNJAM0kmbDvPk2ahJJO3naORnz+hlyEcnKScCbu9gIQ9sQA3nKgoJJMaDhB0ADmANzZoABGhPbQ+XiwRWUV2gDuJmjQ+E6VJuU5Liy2BY0JzTl8kLaQhCNNoAA+IiyeZEz9oLX2tgCesJJ8WDT1hWOLy-Cr8OsVBvD2CEwUsGgAIg-wG-5MH08voO8EOUAL5xRQAGQA5JBKgAreB8fbuUBMfCgRpSLCSAAXIUwiBMfAO5GwuBYoAMxmItnIsB2mnIk0IXCw2jqtVwAAOwpxDJFNNEHpIMCwOEwYNBjBwABTwVRIPi2fAckiaH6PZ70ClcX7PACUznskiwCjAkyceL4kNJInINMRshsGFEYnUWnsHAAjvhGYJApBApJDLBDBweF44M5XB5JPZKjSTRDHO4YIjhapyQhhOLpJtdNTrcz1MQCPoABb2b2MitOTSgABE4FqbFwHqxxVUsEgoAAdH2qgj7PgsORc8bNpx7kwALQwXagf0Mwh0nv1uJ0hlpQgAdWkZd4sEBggAvMonNIADxNwg2et3XWwevnevfB-1gB85TkG-I14ASlOoCngB9jitAuxXuku6wPuGhHlgn6gIoACavDED+oBliY8hgmArxKKAABySgACqgCRSgAKrgAAEqAABaSiEQAoqaECCFmsAcEuISwAgkbkmI2x5CYPI8Eq+wwHEkzQMIozYCRkDgBWJTwNeQGgNKfDpGg-5Tgax7vqAWQTOkPZ5Bp9ZkK0ABq2w+vWGzaYQPbVLUTCWdZdlKvAjm3GZbSiaeACMABMADMTlmYM8C2J58C2fZvlRS5kzTMQp5WQl3kOSlPZbLs+yHMc8WJT5fnAkAA
type CarRead = Readonly<CarWithoutDates>;
// L'objectif de la quatrière partie est de créer le type correspondant à la mise à jour d'une voiture
// Tous les champs peuvent être mis à jour sauf l'id, la date de création et la date de modification
// et peuvent être mis à jour sans préciser tous les champs
type CarUpdate = Partial<Omit<Car, "id" | "createdAt" | "updatedAt">>;
// On se place dans le contexte où on veut mettre une valeur par défaut pour tous les champs de la voiture de base
// Créer le type correspondant
type CarWithDefaults = Required<Car>;
// On a une liste de marque de voiture et on veut créer le type associé avec toutes les marques et leurs propriétés
type CarBrands =
| "Renault"
| "Peugeot"
| "Toyota"
| "Volkswagen"
| "Skoda"
| "Citroën"
| "Fiat"
| "Mini"
| "Honda"
| "Nissan";
interface BrandInfo {
id: string;
creationDate: Date;
originCountry: string;
}
type CarBrandsWithProperties = Record<CarBrands, BrandInfo>;
// On ne veut que les marques qui ne sont pas japonaises
type CarBrandsJapanese = Extract<CarBrands, "Toyota" | "Honda" | "Nissan">;
type CarBrandsWithoutJapanese = Exclude<
CarBrands,
"Toyota" | "Honda" | "Nissan"
>;
// Exercices sur les type guards
// V1
// https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgGIHsoFs5kgEwBFcIBJEUgZ3WQG8AoZZfEgLmUrClAHMBuZAHpByCAA84WAA4AbCOwCMAdgC0CgExqAnFqX0AvvXqhIsRCmKQAKsCwQAymElS6jZm2QgArlgBG0AWFRCWk5RQA2JXD1LXUABl04pIMjBHQQTmQYTBwwSxQAXmQAChZIdm8-aABKZAKAPhKQCAB3ZHzSkmrqgDowdFJ7AHlHbhAeYuqjeiChkGQANwgvMGQ4BfRgKGQveezsXGRBodF56igwYAgZkQBhCFXxaARgJGQTKHR8L2BVuU84FBPi1eAAaZAIADkEEyMmhYmQCg4Xm2ckoyDAAE8pCgeF5AfhKEYgjYpOwABZ4KSUVjCFr0vrYmEIbhSMAyODjHqYHiCfDoBCUQTkzn4XzodAAa0E6kEIEBwN4PUpWBkAGIsTj0DAVJqICo8QSifQ0hlVr4fjJ8AAZYCcIYwDAHPAQIgkdFFTqQGklfI2OyOZwAHyduQI+XIVHQ1QA2gBdZC1BquJhlGE9fYAUUQ5OKXogScaDCYTCCAE10CiIV8UOToNcmPopoZiSJ7OgZCtgOlUulMhbgFbbfbHTlcOH3eo6iU0z7in7bA4nNIQ2OXW7IJHqLGE4WU+5vRnMNmELn83viyXgDASnrtQeID003UCkUAEScMY8N+1S8l5BQA8KLzGmT4kG4jYQQBQFQHsa4dKBabVHwbhNik9BAA
// https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgJIFs4HMUG8BQyyARnAM4QAKcYAFgFzJlhShYDchyMwANhADk46CI2asQHfAF98+UJFiIUAdWB0M2PFwXR4SACoBPAA6jkAIh5RmFzkWCYcAMQCuvXtTqNNOTrPlwPWVkNToAe1cwX20HIKVDU3MLCgRwkAATOxk5fDSQZmQ4KCg4IwB5GGdgGzAAQUyAZQh8jMYACjDaGIAfLsjopwgASgBtAF0AXmQJznwAennkcpBkADcIKOR88VcalF44ZF5gZhQMiDJuYARaYGgrk2L0YG2IMEhj08+FpZXkBRQcIZPZgY4oU4AhDAAA0b2QAEc9usjq5VghSqsTLxXFdeOFQExXFBwcgQMUgQB3Nhw9LICBYzZg7G4pibfgicDIKJ8U7QZBgJLhGByRbIAzAEyMWgfExkeiLSlKgB0grMZAxkrAh0kyvCUCw8wy4QQZHmtDgmWI4XCAGt5gAmebkkrham6mXoXgAYlxbAAtGqIP6TFAIBkbjRLnIdmCePwvLQrtMKWVKtVag0Ms1Wsr44p2lx2tZmOUoDn0hlhshJgA+a61MsVzLK3QJCDGMzIACEk2mVhqtnww2VmBMhaIYpUKAtGyKq1OZFcM+gKAMjWQxsuZPCYLRF1qloyAotYMcWiL1I0Q2rdeQV+6Q1bQzcHkTytIFETyAA1JZ5hYv73uoj5aM+Wivp4NC0HmfCCMIEDDrkYqNOEOJgMA6QxukhTxlQ0FkA6NZFCUaZVIO9RNC0lawbwBZFiWYBNtRmTDIwjHMa0AJXF0MQ1vWHHlixGStvE+gdkkPZ9pYjEWMOo5wOOl4gTEt71g+MTgS47hQXQH7kPhdBARYAFARpT7ntpb7QbR8EiEhQA
// https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgOrDACwJIFs4DmKA3gFDLLAAmAXMgM5hSgEDc5yARnPRAApwsdRsxBsOMYABsIAOTi4Iwpi3YBfUqVCRYiFOiwB7AK5g8hEh2rLR4jaRlgGhxVhaoIAcQhgAYlBcAQRBAgAdgOmMQAGsQQwB3EHZSBEMQRmQmOHSYQyhcfyDw5ABeZAAKULgoBUiYuMSASlKAPmQyCmAYCswecyIAJkrqhUbmjopkKB9jKBAuY2kqASxhmtxG9goNCmmwWfmAckPSe1T0p176fpQy8uaStqiqCEkQCCpWZAB6b+QATRMUGQqReyEw0AgmnOGU4iyky0EmFKFWA+CIdAMOHREAebTRFgAdNxeCtkQBqZAAIm+VOQlIJREJkhk8kUyVIv2QAGVDFJTMA0pouZgwGBQvQaL9OFJDARCVgIIYqIZCalcN8BgAGAYDb5agCM3zAAE9QhB6AhmKEwABaaahKR6W08W2m80EYzVKj0b6cv4AeXm72Q5tMoZ4yAFUmAvGBVNAdOACGAIOqyDSyBD9DgGAj9AYqadyAAbtVgHAZSgAI7GQ6Z-AgYChYwyZAWpxRFAiFgAGij80MnAAVj5+1Es8ZcJxoP2QK2pOOQC83h9+z4EISt+2nAmQHSQIcO1GwNJY5W27Xu7NkDIC0PRwgwJoUmkMlcbgMUWtagPYgkQEaOgqnWSgCyxG5WmQAMRwgJ9CVCAIwEMd0IEJK4A0SPgAnNKBTTVOApCkH9cH7KkSX4JEqWaAAyGjoNg+DEJQlCzTQjCsJw6B8IQQjiJAhQyJZOQFAgajWCAA
// https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgOrDACwJIFs4DmKA3gFDLIBGcAzhAApxYBcyNYUoBA3OcjMAA2EAHJxcEVu04gepAL6lSoSLEQp0WAPYBXMHkIkFS4WDZaJWLqggBxCGABiUCwEEQrgA7BWOkAGsQLQB3EF5SBC0QdmQOOGiYLShcZzdvZABeZAAKTzgocV8AoNCASkyAPmQyCmAYHMxaAyIAYUwIBH8uABUAT08IGlz88VLymopkKAcdKBAqHSEAE0YsYYLcUt4KRQppsFn5gHIj4wiomMaaZpQs7PKMqr8liAEQCCXuZAB6b+QATV0UGQkReyHa0yUkWiZkoi0EKyYmEyOWA+CIrE0OHREAeVTRhgAdNQ6KtkQBqZAAIm+VOQlIJREJAmEYgk4WhlyaOIATCj1oVkH5AiEQKVWHkNshgDRkAB5PSePR9AaVeWUABWHTAhM8LjAWjA-QghKuctC9BcAygRsJCDggkEAtwABpqSSGEiqeUAGQ+9VahA6vWGw3G020c0gS1aa22+2O51uqks0TiCDe8JG1UKsBKsAq27IABKHSSSwAPP4IL0tPUsTc3cKSiAKqRfsgWg5kFpNd3BmYAG4O4Bg7tRZBwWZwIXvZDQaazSc6KZ+MBoiBQi5mXC9OV9oOsXP5wsoiYesmsEA6R0uviptmSZAAFgArGcO3L5oOIHpkABHHQjiEZA52EcwMGQPIaHbP4AGUtEEPRgCiLcYXBblDDaDoulkQtZTuSVBWbUVxSgkZcGlWUGxxNUrhuHlnV9f1swgOtyI2YlaE9LBMgyLIqWkLg6T9WJjXYojcGZIQ0wkPiBKE2QqXCIA
// https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgOrDACwJIFs4DmKA3gFDLIBGcAzhAApxYBcyNYUoBA3OcjMAA2EAHJxcEVu04gepAL6lSAemXIAKgHsArmGRJBcZPigJMKSsAghjcYDX2bcE8Mk02AbnEHAAJim0bTUoAKwg9EAh2AEuAfiVQSFhEFHooTV9tBD0yCj8pDi5eCgBHbThwDABPAEEvIThKYVYQbVxKaGLkYHwiVnQsPEIIXkVSYT0aJ3DMLlQIAHFwgDF03BqQGoAHYFZAgGsQTQB3EF5SBHd2ZA4KmhhNKFxVp23gZABeZAAKLbgocR7ECHE4gACUnwAfMhct0YD9MLQ0hksmAAMKPKAQbLqKpbCC-f7iMEQ2EULFgbRQGyUbRCXyMLCEgG4AB0PWGYK6inJ4SpNgA5AKFEpLiBrrT6YzMJ8fhy+mgMDhehAIR9ofKIKzqHRpcgANTIABEyiNBu6KtZAmEYgk5zF10RNCGRAAIhABJEGel8VAwFYHF9mYDkAcjqcwaw-izug4APK6La6XH4qHIOOhbFgVlbdJgTRgPFap1x07I32F1kIbyCYO4AA0xp1DCYmCNEIAZB305nsjm8wWi6yS2WfdBK9XBLXo+JG0braJxBB27wHXonS6IGjzAh9lwU1FZXWgSCI1GibhY4rBiq0xuVe7PRBvZoKwG653u4X8Zp4TO2c2eofMBxrSFwZpdjcRa-sg-5WkIi4SJ8IFGmBshGvaVzrki6SZNkGJQFiOJFke-4nuG4Jphw2gjMgqjIFUOhQI4-jIOYWIXFhbE4Si2SPqAz4ANIQFUgY-GRobAhRarQtRtH0YxVIsSg7EQEo34oAmYBJmAB6ygAStijy+AAPPsIkwQMyrDI2YagpCSj0QAypogi6MA7iilxTrInh6KYlmB4uW5-ruKRF7kaCkawReV6+aid48X5-FesJonBe57gfsgkEaTBcF+MhXyoYU6E5V+0F-herJlBU-qFnUdiGE0KDAcVrTtNAEHdvewzbtie6yAeNB1uyKpcpx4rYTQ8V8R6Am+GlNAZaFNhBhJdlnjFMb2Mgs1gEtenqj2YR9rmBaDviw60KWIDluOVRVjWdZzpq7blSdWb9hdGnXTQt33X6j2TtOF6vb472QRmp3Zud+a-SOd1jkDT1Ti9xq1ZUDX1M1wgrupJH7YdJFfIZlxQKZ5mMfC+22VJ9mkEAA
// Exercices sur les génériques
// API Response
// https://www.typescriptlang.org/play?#code/PTAEHkDtQNwUwK4BdQGMBOBLu7QMnKAIIAKAkgFAgTQCGoAzKOgPbJwDOAXKMAA6sAJglRIOAGl6oEHJCwC2ODqDgpgLdIKWgqYADKEAZhvm0UWtJ2ZskVwQHJSZFbNAAbQhwQBLGLUhIVABUFFQCLMKi3KEA3hSgoABEsmYyiTwATAAMWeLxSYocHLQA5nDpSeAA0on5iYJmtBUA2vkJcQmdoN6CPACMbZ2QtIo8iQBy3gDWhADKAEK1XQC+eV0dXd29oBmDCcOjSXq0qCyy5YPL+QC6FFdU0rIKSlyxdSlIaZk5awWcxWUKolqkskg0kE0eK11ns0DI5Ip0AB9Hr9WGGbzoWTjEZwMYAKRYAAtIKCEqtBhsuo8ETgUdtdptQAc8UkiG5vKgLisbndQupNC83glkhDPhwKtlcnVCgDymMQXVwZDQNDOlTOhotMjUaABkzvLZ5NxVbD2mbOuFIkh6f1fkyKUzzU7LUIRDbdRl7ZtHZtbitvRqElq6Z7YYa4MaoRag5sre7bXrvQGYxaEvHRImvRbfV1-Z0rglbvcKAZQAAjZAucyEJAATz4OHcVnQqjYWNAFjcjnIoFo8FQjG6ARwhhOVjg0EwMEN-hQbnowj4HNQZm8LEgPHAgvQTgASpw+BuOHBJABheHPXfkA8cI+QE+SEhuqL7w-HuAUIlIJB8bggAB3ICADp60bDgMG8PgkAXSASmAjQSmAQQWFQDhgCJfxBHLFgWCmYAMmAMoCHQTkOGA795DcCggmAfkwBxXxPwobwR3QMcuQgHc3zvD9QA2D4ZB4SAEHkcscAAbnyWVSlZWRSLgqSEmVHgNRDHVthEsTJMGCMo342EMw9TTRPE9AlILZp82WKy+RYtiOMIZ8IndHj7xPAyEkEk0tLMiyZLKHh5NYkoLJUzzOl1XydK6FkgqQBTQvyGzi1CVjbHY8dQAvJ5ETcviBLFITmVMmLQACuSEpCsLGlUwYaSvRNovMwYMSxJAcUOYLFOS2z7moWYWDcZB10gNKHKy5zrQiqLSpa-ZcXixKpPudLRyy7dtTII0IqMpq5pW+yMscrjtQi4Md327T5sio0TU2nBtsjPrxuOrKctpXAIoaxErr8-I2uxRbQG6pLVomziiD4bxb3cuAAB4ABUAD4Iu84SDuk-5ZKW6r8nCxG7LAwgPqvfKHzgQbhqQUbQAAXmIaHYY-eHScRKzkYoYnTpwcmTypkaN3pxmYffCn4Ye9AOa5hsnJfJA+cpobBegBmodF3jxam90OaAA
// Un exercice sur les FF avec les keyof @Fatine Done
// Un exercice un peu plus dur sur les génériques avec keyof, ou générique dans les fonctions @hadrien
// https://www.typescriptlang.org/play?ssl=12&ssc=2&pln=10&pc=1#code/PTAEHUFNQdwQwHYBdRIPagMYCdJydHKACKSQAOoACnNkgJZwA2oaARgFaSYoBm2aALagiAc3oA3SAlD1kkbLziZIAKBCgAYmmyhIADziDyTaDGgALOFNQXovNEyZoYc0bPmLla9WACSKADOFmgArkwAJqBs0KLSCvSYoIEY5noImGHYcHGgoYFuoHEICUlIAJ7kkIGgFkhI5IEAXCAwbQB0SKHo2IxMgQTKdtjtmYLAFVWBOPTkSBOV1TNzALTFpStyBF4qqqqT0ABykDA0dH0APAAqAHygALygAN6qoG+gANoA0h6gANaQcpoXigK4AXQA-E1Qd8wQBuVQAXz2B1AAHlBPQkAAma4AGlAPwMBAQERqAKBINuD2er3eHwAqr8KcDQSIakzidIyYTQBDQCUpNhoQywdCroywUi9lsFEoVFodMIXu89II4PQmNCBr0EKIEaq4BEIrhAs1aarVTqyEhtUhdfq6ZasFjynaHQb3sjkftForsIJwFiQt0AKLqzU0jFY3HaAMEgBEkAjTATNxRfrODGYceEjyzl1zNwRvgg0EwiAQaBQVhsRpN1RqriQFlYCCY5REyXtNr2mQQAxExtN5oLOaVNJV73rI+hU+dIFD2AE2CdlutkFtoATdicaATa+9ew0VzsRTQzFkNXQWFw+EIoFwmFC2AKNllO2gLfwsE1LDg5AmJ25C0NmLA3pgFiag2MjkAIVTnNUqBoGgpZXLMIqBOWaCkli9A4ZeBzmnUDTNK0HREcsSBMIgojtDoojABEaCYIEwBWKSbAoX8wDYsA-YRHhBFMCsRHtHUghMH2OGDgQAxopw3BbqQFBjkwACCA7mNgFxFpOa4zo2c5rqqi7LjoJnvBuW47pAe4HqqR6lgAyo43T4QgGZVCQZDkGp1x3I8U7fMygKsuCUIwl8YJ6PoJI8uwXA8HyPmqaBlwStFdzirC0qqP2g6GWa2LQipfnpcwulKoFFrTsORm1QuwCHBgCgrpZbzWdCtn2YeeUaAAEi4oDMUhWKwDofwQqWUC1NYD7rL0ZR+lcBJpPAyDIVgdiYH8sggg4uiQEKnYUrY0BwWgCEVCIKASn8MX0DUiCsIpPCln4ILjU950IGt0DqgCtg-Zd12dldDDCb+LbnXy0KIFEAFAal5XnIRGAtj9iVKQS9BfUgADkNRVigLbSLIhM1PdUrHsA4BWCgeOwGYiAEFEOEdrDNGDqYUgsKDCgMEhN4xKwcwecwMqePK0C5mVjVqhqWrdh6Bn1WaxnOp1PabprWuqkwciQAAjO6bievrbyGyUJUq+bHWgMi+voDACBm3qFuO3lqJlWpAAycADH7x12QF+lvCFcj-GFVJilFMVcqSNTY8l-K+xVTAB0HIdMNcsLZaAAAUmUxQAPnkpKQLwRsRAAlN7fpZ0gwd87mNLp2jmeB83OdVQGZXpvlMkoCUMDqer5pNy3dlt0Fa7Jkr0KhJX1clBEeJqw2GsK1aOtbvOlvWybS8rzXG+W+8R+28vERVzXDuIufWsu27Fe36vkDr28fU+gVI8nOPLegQWpIAAGrMHoBEaEU8c6zwVgvTUJ935n03rOHeVk95ILvmvJ+zoX5YI-l-UAP8gA