From 56ba6a3fa931a3e1c2d9040819f02db4642591bf Mon Sep 17 00:00:00 2001 From: Radoslav Karaivanov Date: Thu, 3 Jul 2025 18:08:43 +0300 Subject: [PATCH 1/7] wip: Performance service instrumentation --- .../src/lib/performance.service.ts | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 projects/igniteui-angular/src/lib/performance.service.ts diff --git a/projects/igniteui-angular/src/lib/performance.service.ts b/projects/igniteui-angular/src/lib/performance.service.ts new file mode 100644 index 00000000000..d772afb833f --- /dev/null +++ b/projects/igniteui-angular/src/lib/performance.service.ts @@ -0,0 +1,121 @@ +import { inject, Injectable, NgZone, isDevMode } from '@angular/core'; + +function isInstrumented(): boolean { + return window.performance && performance.measure && isDevMode(); +} + +@Injectable({ providedIn: 'root' }) +export class PerformanceService { + private readonly ngZone = inject(NgZone); + private logEnabled = false; + + constructor() { + if (isInstrumented() && !('$$clearMeasures' in window)) { + (window as any).$$clearMeasures = () => this.clearAll(); + console.debug('`$$clearMeasures` available on the `window` object.'); + } + } + + public setLogEnabled(state: boolean): void { + this.logEnabled = state; + } + + public start(name: string) { + if (!isInstrumented) { + return () => { }; + } + + const startMark = `${name}:start`; + const endMark = `${name}:end`; + + this._mark(startMark); + + return () => { + this._mark(endMark); + this._measure(name, startMark, endMark); + }; + } + + public getCustomMeasures(): PerformanceMeasure[] { + return performance.getEntriesByType('measure') as PerformanceMeasure[]; + } + + public clearAllCustomMarks(): void { + if (isInstrumented()) { + performance.clearMarks(); + if (this.logEnabled) { + console.debug('All custom performance marks cleared.'); + } + } + } + + public clearAllCustomMeasures(): void { + if (isInstrumented()) { + performance.clearMeasures(); + if (this.logEnabled) { + console.debug('All custom performance measures cleared.'); + } + } + } + + public clearAll(): void { + this.clearAllCustomMarks(); + this.clearAllCustomMeasures(); + } + + + protected _mark(name: string): void { + if (isInstrumented()) { + performance.mark(name); + } + } + + protected _measure(name: string, startMark: string, endMark: string): void { + if (isInstrumented()) { + performance.measure(name, startMark, endMark); + if (this.logEnabled) { + const entry = performance.getEntriesByName(name).at(-1); + console.log(`Performance Measure : ${entry.name} - Duration: ${entry.duration.toFixed(2)}ms`); + } + } + } + + protected _startObservingPerformance(): void { + const logEnabled = this.logEnabled; + + if (isInstrumented()) { + this.ngZone.runOutsideAngular(() => { + const observer = new PerformanceObserver((list) => { + if (logEnabled) { + for (const entry of list.getEntries()) { + console.log(`Performance Entry: ${entry.name} (${entry.entryType}) - Duration: ${entry.duration.toFixed(2)}ms`); + } + } + }); + + observer.observe({ entryTypes: ['navigation', 'resource', 'paint', 'longtask', 'element', 'event'] }); + }); + } + } + + // public mark(name: string): void { + // performance.mark(name); + // } + + // public measure(name: string, startMark: string, endMark: string): void { + // performance.measure(name, { + + // }) + + // performance.measure(name, startMark, endMark); + + // const entry = performance.getEntriesByName(name).pop(); + // if (entry) { + // console.log(`Performance Measure: ${entry.name} - Duration: ${entry.duration.toFixed(3)}ms`); + // } + + // performance.clearMarks(startMark); + // performance.clearMarks(endMark); + // performance.clearMeasures(name); + // } +} From 912f503766136019279ca38c65b86d7ea4947d7c Mon Sep 17 00:00:00 2001 From: Radoslav Karaivanov Date: Mon, 14 Jul 2025 11:03:19 +0300 Subject: [PATCH 2/7] wip: Performance service and tools for tracking performance changes --- .../src/lib/performance.service.ts | 176 +++++++++--------- 1 file changed, 89 insertions(+), 87 deletions(-) diff --git a/projects/igniteui-angular/src/lib/performance.service.ts b/projects/igniteui-angular/src/lib/performance.service.ts index d772afb833f..ba99360ed9d 100644 --- a/projects/igniteui-angular/src/lib/performance.service.ts +++ b/projects/igniteui-angular/src/lib/performance.service.ts @@ -1,121 +1,123 @@ import { inject, Injectable, NgZone, isDevMode } from '@angular/core'; -function isInstrumented(): boolean { - return window.performance && performance.measure && isDevMode(); + +interface igcPerformance { + startMeasure: typeof startMeasure; + getMeasures: typeof getMeasures; + clearMeasures: typeof clearMeasures, + clearAll: typeof clearAll } -@Injectable({ providedIn: 'root' }) -export class PerformanceService { - private readonly ngZone = inject(NgZone); - private logEnabled = false; +declare global { + var $$igcPerformance: igcPerformance; +} - constructor() { - if (isInstrumented() && !('$$clearMeasures' in window)) { - (window as any).$$clearMeasures = () => this.clearAll(); - console.debug('`$$clearMeasures` available on the `window` object.'); - } - } +function isInstrumented(): boolean { + return globalThis.performance && performance.measure && isDevMode(); +} - public setLogEnabled(state: boolean): void { - this.logEnabled = state; +function instrumentGlobalHelpers(): void { + if (!isInstrumented() || Object.hasOwn(globalThis, '$$igcPerformance')) { + return; } - public start(name: string) { - if (!isInstrumented) { - return () => { }; - } + globalThis.$$igcPerformance = { + startMeasure, + getMeasures, + clearMeasures, + clearAll, + }; - const startMark = `${name}:start`; - const endMark = `${name}:end`; + console.debug('Performance helper functions attached @ `global.$$igcPerformance`'); - this._mark(startMark); +} - return () => { - this._mark(endMark); - this._measure(name, startMark, endMark); - }; - } +export function startMeasure(name: string, withLogging = false) { + if (!isInstrumented()) return () => { }; - public getCustomMeasures(): PerformanceMeasure[] { - return performance.getEntriesByType('measure') as PerformanceMeasure[]; - } + const startMark = `${name}:start`; + const endMark = `${name}:end`; - public clearAllCustomMarks(): void { - if (isInstrumented()) { - performance.clearMarks(); - if (this.logEnabled) { - console.debug('All custom performance marks cleared.'); - } - } - } + performance.mark(startMark); - public clearAllCustomMeasures(): void { - if (isInstrumented()) { - performance.clearMeasures(); - if (this.logEnabled) { - console.debug('All custom performance measures cleared.'); - } + return () => { + performance.mark(endMark); + performance.measure(name, startMark, endMark); + if (withLogging) { + const entry = performance.getEntriesByName(name).at(-1); + console.debug(`Performance Measure : ${entry.name} - Duration: ${entry.duration.toFixed(2)}ms`); } + }; +} + +export function getMeasures(name?: string): PerformanceEntryList { + return name ? performance.getEntriesByName(name) : performance.getEntriesByType('measure'); +} + +export function clearMeasures(name?: string, withLogging = false): void { + performance.clearMeasures(name); + if (withLogging) { + console.debug(name ? 'Cleared all measures of type `${name}`' : 'Cleared all custom measures'); } +} - public clearAll(): void { - this.clearAllCustomMarks(); - this.clearAllCustomMeasures(); +export function clearAll(withLogging = false): void { + performance.clearMarks(); + clearMeasures(); + if (withLogging) { + console.debug('Cleared all marks and custom measures'); } +} +@Injectable({ providedIn: 'root' }) +export class PerformanceService { + private readonly _ngZone = inject(NgZone); + private _logEnabled = false; - protected _mark(name: string): void { - if (isInstrumented()) { - performance.mark(name); - } + constructor() { + instrumentGlobalHelpers(); } - protected _measure(name: string, startMark: string, endMark: string): void { - if (isInstrumented()) { - performance.measure(name, startMark, endMark); - if (this.logEnabled) { - const entry = performance.getEntriesByName(name).at(-1); - console.log(`Performance Measure : ${entry.name} - Duration: ${entry.duration.toFixed(2)}ms`); - } - } + public setLogEnabled(state: boolean): void { + this._logEnabled = state; } - protected _startObservingPerformance(): void { - const logEnabled = this.logEnabled; + public start(name: string) { + return startMeasure(name, this._logEnabled); + } - if (isInstrumented()) { - this.ngZone.runOutsideAngular(() => { - const observer = new PerformanceObserver((list) => { - if (logEnabled) { - for (const entry of list.getEntries()) { - console.log(`Performance Entry: ${entry.name} (${entry.entryType}) - Duration: ${entry.duration.toFixed(2)}ms`); - } - } - }); + public getMeasures(name?: string): PerformanceEntryList { + return getMeasures(name); + } - observer.observe({ entryTypes: ['navigation', 'resource', 'paint', 'longtask', 'element', 'event'] }); - }); - } + public clearMeasures(name?: string): void { + clearMeasures(name, this._logEnabled); } - // public mark(name: string): void { - // performance.mark(name); - // } + public clearAll(): void { + clearAll(this._logEnabled); + } - // public measure(name: string, startMark: string, endMark: string): void { - // performance.measure(name, { + public attachObserver(options?: PerformanceObserverInit) { + if (!isInstrumented()) return; + let observer: PerformanceObserver; - // }) + options = options ?? { entryTypes: ['event', 'long-animation-frame', 'longtask', 'taskattribution'] }; - // performance.measure(name, startMark, endMark); + this._ngZone.runOutsideAngular(() => { + observer = new PerformanceObserver((list) => { + if (this._logEnabled) { + for (const entry of list.getEntries()) { + console.debug(`Performance Entry: ${entry.name} (${entry.entryType}) - Duration: ${entry.duration.toFixed(2)}ms`); + } + } + }); - // const entry = performance.getEntriesByName(name).pop(); - // if (entry) { - // console.log(`Performance Measure: ${entry.name} - Duration: ${entry.duration.toFixed(3)}ms`); - // } + observer.observe(options); + }); - // performance.clearMarks(startMark); - // performance.clearMarks(endMark); - // performance.clearMeasures(name); - // } + return () => { + observer.disconnect(); + }; + } } From 0e03d318cacabce64ee52c6f625a54bf5bcec141 Mon Sep 17 00:00:00 2001 From: Martin Dragnev <37667452+mddragnev@users.noreply.github.com> Date: Mon, 21 Jul 2025 14:26:36 +0300 Subject: [PATCH 3/7] feat(performance): Add a grid sample as a project to test performance optimizations (#16050) --- angular.json | 91 + package.json | 1 + .../public/favicon.ico | Bin 0 -> 15086 bytes .../src/app/app.component.html | 8 + .../src/app/app.component.scss | 18 + .../src/app/app.component.spec.ts | 23 + .../src/app/app.component.ts | 13 + .../src/app/app.config.ts | 14 + .../src/app/app.routes.ts | 21 + .../src/app/data/athletesData.ts | 2037 +++++++++++++++++ .../src/app/grid/grid.component.html | 20 + .../src/app/grid/grid.component.scss | 10 + .../src/app/grid/grid.component.ts | 37 + .../src/app/lib/mulberry.ts | 16 + .../src/app/services/data.service.ts | 77 + .../src/assets/images/flags/ad.png | Bin 0 -> 449 bytes .../src/assets/images/flags/ae.png | Bin 0 -> 131 bytes .../src/assets/images/flags/af.png | Bin 0 -> 342 bytes .../src/assets/images/flags/ag.png | Bin 0 -> 486 bytes .../src/assets/images/flags/al.png | Bin 0 -> 357 bytes .../src/assets/images/flags/am.png | Bin 0 -> 124 bytes .../src/assets/images/flags/ao.png | Bin 0 -> 310 bytes .../src/assets/images/flags/ar.png | Bin 0 -> 139 bytes .../src/assets/images/flags/at.png | Bin 0 -> 101 bytes .../src/assets/images/flags/au.png | Bin 0 -> 501 bytes .../src/assets/images/flags/az.png | Bin 0 -> 175 bytes .../src/assets/images/flags/ba.png | Bin 0 -> 241 bytes .../src/assets/images/flags/bb.png | Bin 0 -> 243 bytes .../src/assets/images/flags/bd.png | Bin 0 -> 200 bytes .../src/assets/images/flags/be.png | Bin 0 -> 108 bytes .../src/assets/images/flags/bf.png | Bin 0 -> 181 bytes .../src/assets/images/flags/bg.png | Bin 0 -> 121 bytes .../src/assets/images/flags/bh.png | Bin 0 -> 125 bytes .../src/assets/images/flags/bi.png | Bin 0 -> 470 bytes .../src/assets/images/flags/bj.png | Bin 0 -> 100 bytes .../src/assets/images/flags/bn.png | Bin 0 -> 847 bytes .../src/assets/images/flags/bo.png | Bin 0 -> 117 bytes .../src/assets/images/flags/br.png | Bin 0 -> 436 bytes .../src/assets/images/flags/bs.png | Bin 0 -> 221 bytes .../src/assets/images/flags/bt.png | Bin 0 -> 685 bytes .../src/assets/images/flags/bw.png | Bin 0 -> 105 bytes .../src/assets/images/flags/by.png | Bin 0 -> 307 bytes .../src/assets/images/flags/bz.png | Bin 0 -> 751 bytes .../src/assets/images/flags/ca.png | Bin 0 -> 302 bytes .../src/assets/images/flags/cd.png | Bin 0 -> 451 bytes .../src/assets/images/flags/cf.png | Bin 0 -> 197 bytes .../src/assets/images/flags/cg.png | Bin 0 -> 142 bytes .../src/assets/images/flags/ch.png | Bin 0 -> 107 bytes .../src/assets/images/flags/ci.png | Bin 0 -> 97 bytes .../src/assets/images/flags/ck.png | Bin 0 -> 1480 bytes .../src/assets/images/flags/cl.png | Bin 0 -> 147 bytes .../src/assets/images/flags/cm.png | Bin 0 -> 163 bytes .../src/assets/images/flags/cn.png | Bin 0 -> 214 bytes .../src/assets/images/flags/co.png | Bin 0 -> 99 bytes .../src/assets/images/flags/cr.png | Bin 0 -> 116 bytes .../src/assets/images/flags/cu.png | Bin 0 -> 300 bytes .../src/assets/images/flags/cv.png | Bin 0 -> 300 bytes .../src/assets/images/flags/cy.png | Bin 0 -> 317 bytes .../src/assets/images/flags/cz.png | Bin 0 -> 217 bytes .../src/assets/images/flags/de.png | Bin 0 -> 99 bytes .../src/assets/images/flags/dj.png | Bin 0 -> 373 bytes .../src/assets/images/flags/dk.png | Bin 0 -> 125 bytes .../src/assets/images/flags/dm.png | Bin 0 -> 403 bytes .../src/assets/images/flags/do.png | Bin 0 -> 258 bytes .../src/assets/images/flags/dz.png | Bin 0 -> 229 bytes .../src/assets/images/flags/ec.png | Bin 0 -> 397 bytes .../src/assets/images/flags/ee.png | Bin 0 -> 100 bytes .../src/assets/images/flags/eg.png | Bin 0 -> 256 bytes .../src/assets/images/flags/eh.png | Bin 0 -> 379 bytes .../src/assets/images/flags/er.png | Bin 0 -> 535 bytes .../src/assets/images/flags/es.png | Bin 0 -> 287 bytes .../src/assets/images/flags/et.png | Bin 0 -> 355 bytes .../src/assets/images/flags/fi.png | Bin 0 -> 130 bytes .../src/assets/images/flags/fj.png | Bin 0 -> 617 bytes .../src/assets/images/flags/fm.png | Bin 0 -> 149 bytes .../src/assets/images/flags/fr.png | Bin 0 -> 96 bytes .../src/assets/images/flags/ga.png | Bin 0 -> 117 bytes .../src/assets/images/flags/gb.png | Bin 0 -> 434 bytes .../src/assets/images/flags/gd.png | Bin 0 -> 490 bytes .../src/assets/images/flags/ge.png | Bin 0 -> 148 bytes .../src/assets/images/flags/gh.png | Bin 0 -> 222 bytes .../src/assets/images/flags/gm.png | Bin 0 -> 129 bytes .../src/assets/images/flags/gn.png | Bin 0 -> 97 bytes .../src/assets/images/flags/gq.png | Bin 0 -> 325 bytes .../src/assets/images/flags/gr.png | Bin 0 -> 266 bytes .../src/assets/images/flags/gt.png | Bin 0 -> 279 bytes .../src/assets/images/flags/gw.png | Bin 0 -> 234 bytes .../src/assets/images/flags/gy.png | Bin 0 -> 464 bytes .../src/assets/images/flags/hn.png | Bin 0 -> 216 bytes .../src/assets/images/flags/hr.png | Bin 0 -> 517 bytes .../src/assets/images/flags/ht.png | Bin 0 -> 227 bytes .../src/assets/images/flags/hu.png | Bin 0 -> 113 bytes .../src/assets/images/flags/id.png | Bin 0 -> 93 bytes .../src/assets/images/flags/ie.png | Bin 0 -> 119 bytes .../src/assets/images/flags/il.png | Bin 0 -> 181 bytes .../src/assets/images/flags/in.png | Bin 0 -> 149 bytes .../src/assets/images/flags/iq.png | Bin 0 -> 258 bytes .../src/assets/images/flags/ir.png | Bin 0 -> 505 bytes .../src/assets/images/flags/is.png | Bin 0 -> 154 bytes .../src/assets/images/flags/it.png | Bin 0 -> 96 bytes .../src/assets/images/flags/jm.png | Bin 0 -> 174 bytes .../src/assets/images/flags/jo.png | Bin 0 -> 230 bytes .../src/assets/images/flags/jp.png | Bin 0 -> 160 bytes .../src/assets/images/flags/ke.png | Bin 0 -> 265 bytes .../src/assets/images/flags/kg.png | Bin 0 -> 414 bytes .../src/assets/images/flags/kh.png | Bin 0 -> 407 bytes .../src/assets/images/flags/ki.png | Bin 0 -> 509 bytes .../src/assets/images/flags/km.png | Bin 0 -> 441 bytes .../src/assets/images/flags/kn.png | Bin 0 -> 374 bytes .../src/assets/images/flags/kp.png | Bin 0 -> 343 bytes .../src/assets/images/flags/kr.png | Bin 0 -> 521 bytes .../src/assets/images/flags/ks.png | Bin 0 -> 357 bytes .../src/assets/images/flags/kw.png | Bin 0 -> 224 bytes .../src/assets/images/flags/kz.png | Bin 0 -> 546 bytes .../src/assets/images/flags/la.png | Bin 0 -> 142 bytes .../src/assets/images/flags/lb.png | Bin 0 -> 323 bytes .../src/assets/images/flags/lc.png | Bin 0 -> 355 bytes .../src/assets/images/flags/li.png | Bin 0 -> 226 bytes .../src/assets/images/flags/lk.png | Bin 0 -> 665 bytes .../src/assets/images/flags/lr.png | Bin 0 -> 338 bytes .../src/assets/images/flags/ls.png | Bin 0 -> 216 bytes .../src/assets/images/flags/lt.png | Bin 0 -> 109 bytes .../src/assets/images/flags/lu.png | Bin 0 -> 121 bytes .../src/assets/images/flags/lv.png | Bin 0 -> 93 bytes .../src/assets/images/flags/ly.png | Bin 0 -> 244 bytes .../src/assets/images/flags/ma.png | Bin 0 -> 309 bytes .../src/assets/images/flags/mc.png | Bin 0 -> 90 bytes .../src/assets/images/flags/md.png | Bin 0 -> 342 bytes .../src/assets/images/flags/me.png | Bin 0 -> 490 bytes .../src/assets/images/flags/mg.png | Bin 0 -> 101 bytes .../src/assets/images/flags/mh.png | Bin 0 -> 821 bytes .../src/assets/images/flags/mk.png | Bin 0 -> 356 bytes .../src/assets/images/flags/ml.png | Bin 0 -> 98 bytes .../src/assets/images/flags/mm.png | Bin 0 -> 336 bytes .../src/assets/images/flags/mn.png | Bin 0 -> 275 bytes .../src/assets/images/flags/mr.png | Bin 0 -> 304 bytes .../src/assets/images/flags/mt.png | Bin 0 -> 153 bytes .../src/assets/images/flags/mu.png | Bin 0 -> 107 bytes .../src/assets/images/flags/mv.png | Bin 0 -> 160 bytes .../src/assets/images/flags/mw.png | Bin 0 -> 261 bytes .../src/assets/images/flags/mx.png | Bin 0 -> 309 bytes .../src/assets/images/flags/my.png | Bin 0 -> 416 bytes .../src/assets/images/flags/mz.png | Bin 0 -> 420 bytes .../src/assets/images/flags/na.png | Bin 0 -> 267 bytes .../src/assets/images/flags/ne.png | Bin 0 -> 150 bytes .../src/assets/images/flags/ng.png | Bin 0 -> 99 bytes .../src/assets/images/flags/ni.png | Bin 0 -> 281 bytes .../src/assets/images/flags/nl.png | Bin 0 -> 108 bytes .../src/assets/images/flags/no.png | Bin 0 -> 154 bytes .../src/assets/images/flags/np.png | Bin 0 -> 490 bytes .../src/assets/images/flags/nr.png | Bin 0 -> 188 bytes .../src/assets/images/flags/nu.png | Bin 0 -> 963 bytes .../src/assets/images/flags/nz.png | Bin 0 -> 463 bytes .../src/assets/images/flags/om.png | Bin 0 -> 256 bytes .../src/assets/images/flags/pa.png | Bin 0 -> 196 bytes .../src/assets/images/flags/pe.png | Bin 0 -> 91 bytes .../src/assets/images/flags/pg.png | Bin 0 -> 556 bytes .../src/assets/images/flags/ph.png | Bin 0 -> 500 bytes .../src/assets/images/flags/pk.png | Bin 0 -> 319 bytes .../src/assets/images/flags/pl.png | Bin 0 -> 91 bytes .../src/assets/images/flags/pt.png | Bin 0 -> 395 bytes .../src/assets/images/flags/pw.png | Bin 0 -> 156 bytes .../src/assets/images/flags/py.png | Bin 0 -> 228 bytes .../src/assets/images/flags/qa.png | Bin 0 -> 229 bytes .../src/assets/images/flags/ro.png | Bin 0 -> 98 bytes .../src/assets/images/flags/rs.png | Bin 0 -> 523 bytes .../src/assets/images/flags/ru.png | Bin 0 -> 114 bytes .../src/assets/images/flags/rw.png | Bin 0 -> 285 bytes .../src/assets/images/flags/sa.png | Bin 0 -> 390 bytes .../src/assets/images/flags/sb.png | Bin 0 -> 326 bytes .../src/assets/images/flags/sc.png | Bin 0 -> 467 bytes .../src/assets/images/flags/sd.png | Bin 0 -> 265 bytes .../src/assets/images/flags/se.png | Bin 0 -> 97 bytes .../src/assets/images/flags/sg.png | Bin 0 -> 240 bytes .../src/assets/images/flags/si.png | Bin 0 -> 244 bytes .../src/assets/images/flags/sk.png | Bin 0 -> 341 bytes .../src/assets/images/flags/sl.png | Bin 0 -> 116 bytes .../src/assets/images/flags/sm.png | Bin 0 -> 352 bytes .../src/assets/images/flags/sn.png | Bin 0 -> 167 bytes .../src/assets/images/flags/so.png | Bin 0 -> 177 bytes .../src/assets/images/flags/sr.png | Bin 0 -> 205 bytes .../src/assets/images/flags/st.png | Bin 0 -> 207 bytes .../src/assets/images/flags/sv.png | Bin 0 -> 260 bytes .../src/assets/images/flags/sy.png | Bin 0 -> 171 bytes .../src/assets/images/flags/sz.png | Bin 0 -> 537 bytes .../src/assets/images/flags/td.png | Bin 0 -> 98 bytes .../src/assets/images/flags/tg.png | Bin 0 -> 233 bytes .../src/assets/images/flags/th.png | Bin 0 -> 115 bytes .../src/assets/images/flags/tj.png | Bin 0 -> 283 bytes .../src/assets/images/flags/tl.png | Bin 0 -> 302 bytes .../src/assets/images/flags/tm.png | Bin 0 -> 572 bytes .../src/assets/images/flags/tn.png | Bin 0 -> 236 bytes .../src/assets/images/flags/to.png | Bin 0 -> 164 bytes .../src/assets/images/flags/tr.png | Bin 0 -> 229 bytes .../src/assets/images/flags/tt.png | Bin 0 -> 508 bytes .../src/assets/images/flags/tv.png | Bin 0 -> 745 bytes .../src/assets/images/flags/tw.png | Bin 0 -> 171 bytes .../src/assets/images/flags/tz.png | Bin 0 -> 226 bytes .../src/assets/images/flags/ua.png | Bin 0 -> 93 bytes .../src/assets/images/flags/ug.png | Bin 0 -> 247 bytes .../src/assets/images/flags/us.png | Bin 0 -> 564 bytes .../src/assets/images/flags/uy.png | Bin 0 -> 403 bytes .../src/assets/images/flags/uz.png | Bin 0 -> 304 bytes .../src/assets/images/flags/va.png | Bin 0 -> 268 bytes .../src/assets/images/flags/vc.png | Bin 0 -> 237 bytes .../src/assets/images/flags/ve.png | Bin 0 -> 231 bytes .../src/assets/images/flags/vn.png | Bin 0 -> 268 bytes .../src/assets/images/flags/vu.png | Bin 0 -> 540 bytes .../src/assets/images/flags/ws.png | Bin 0 -> 216 bytes .../src/assets/images/flags/ye.png | Bin 0 -> 114 bytes .../src/assets/images/flags/za.png | Bin 0 -> 295 bytes .../src/assets/images/flags/zm.png | Bin 0 -> 248 bytes .../src/assets/images/flags/zw.png | Bin 0 -> 432 bytes .../src/index.html | 13 + .../igniteui-angular-performance/src/main.ts | 6 + .../src/styles.scss | 23 + .../tsconfig.app.json | 15 + .../tsconfig.spec.json | 14 + tsconfig.json | 10 +- 219 files changed, 2466 insertions(+), 1 deletion(-) create mode 100644 projects/igniteui-angular-performance/public/favicon.ico create mode 100644 projects/igniteui-angular-performance/src/app/app.component.html create mode 100644 projects/igniteui-angular-performance/src/app/app.component.scss create mode 100644 projects/igniteui-angular-performance/src/app/app.component.spec.ts create mode 100644 projects/igniteui-angular-performance/src/app/app.component.ts create mode 100644 projects/igniteui-angular-performance/src/app/app.config.ts create mode 100644 projects/igniteui-angular-performance/src/app/app.routes.ts create mode 100644 projects/igniteui-angular-performance/src/app/data/athletesData.ts create mode 100644 projects/igniteui-angular-performance/src/app/grid/grid.component.html create mode 100644 projects/igniteui-angular-performance/src/app/grid/grid.component.scss create mode 100644 projects/igniteui-angular-performance/src/app/grid/grid.component.ts create mode 100644 projects/igniteui-angular-performance/src/app/lib/mulberry.ts create mode 100644 projects/igniteui-angular-performance/src/app/services/data.service.ts create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ad.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ae.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/af.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ag.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/al.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/am.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ao.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ar.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/at.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/au.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/az.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ba.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/bb.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/bd.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/be.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/bf.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/bg.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/bh.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/bi.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/bj.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/bn.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/bo.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/br.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/bs.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/bt.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/bw.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/by.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/bz.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ca.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/cd.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/cf.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/cg.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ch.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ci.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ck.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/cl.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/cm.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/cn.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/co.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/cr.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/cu.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/cv.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/cy.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/cz.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/de.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/dj.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/dk.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/dm.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/do.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/dz.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ec.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ee.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/eg.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/eh.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/er.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/es.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/et.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/fi.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/fj.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/fm.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/fr.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ga.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/gb.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/gd.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ge.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/gh.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/gm.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/gn.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/gq.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/gr.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/gt.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/gw.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/gy.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/hn.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/hr.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ht.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/hu.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/id.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ie.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/il.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/in.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/iq.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ir.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/is.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/it.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/jm.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/jo.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/jp.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ke.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/kg.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/kh.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ki.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/km.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/kn.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/kp.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/kr.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ks.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/kw.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/kz.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/la.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/lb.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/lc.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/li.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/lk.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/lr.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ls.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/lt.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/lu.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/lv.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ly.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ma.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/mc.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/md.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/me.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/mg.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/mh.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/mk.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ml.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/mm.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/mn.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/mr.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/mt.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/mu.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/mv.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/mw.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/mx.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/my.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/mz.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/na.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ne.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ng.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ni.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/nl.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/no.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/np.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/nr.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/nu.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/nz.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/om.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/pa.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/pe.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/pg.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ph.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/pk.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/pl.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/pt.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/pw.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/py.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/qa.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ro.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/rs.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ru.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/rw.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/sa.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/sb.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/sc.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/sd.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/se.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/sg.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/si.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/sk.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/sl.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/sm.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/sn.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/so.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/sr.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/st.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/sv.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/sy.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/sz.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/td.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/tg.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/th.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/tj.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/tl.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/tm.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/tn.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/to.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/tr.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/tt.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/tv.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/tw.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/tz.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ua.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ug.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/us.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/uy.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/uz.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/va.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/vc.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ve.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/vn.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/vu.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ws.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/ye.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/za.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/zm.png create mode 100644 projects/igniteui-angular-performance/src/assets/images/flags/zw.png create mode 100644 projects/igniteui-angular-performance/src/index.html create mode 100644 projects/igniteui-angular-performance/src/main.ts create mode 100644 projects/igniteui-angular-performance/src/styles.scss create mode 100644 projects/igniteui-angular-performance/tsconfig.app.json create mode 100644 projects/igniteui-angular-performance/tsconfig.spec.json diff --git a/angular.json b/angular.json index 421bc145a56..fcc527e239e 100644 --- a/angular.json +++ b/angular.json @@ -478,6 +478,97 @@ } } } + }, + "igniteui-angular-performance": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "projects/igniteui-angular-performance", + "sourceRoot": "projects/igniteui-angular-performance/src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular/build:application", + "options": { + "browser": "projects/igniteui-angular-performance/src/main.ts", + "polyfills": [ + "zone.js" + ], + "tsConfig": "projects/igniteui-angular-performance/tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + "projects/igniteui-angular-performance/src/assets" + ], + "styles": [ + "projects/igniteui-angular-performance/src/styles.scss" + ], + "stylePreprocessorOptions": { + "includePaths": ["node_modules"] + } + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kB", + "maximumError": "1MB" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "4kB", + "maximumError": "8kB" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular/build:dev-server", + "configurations": { + "production": { + "buildTarget": "igniteui-angular-performance:build:production" + }, + "development": { + "buildTarget": "igniteui-angular-performance:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular/build:extract-i18n" + }, + "test": { + "builder": "@angular/build:karma", + "options": { + "polyfills": [ + "zone.js", + "zone.js/testing" + ], + "tsConfig": "projects/igniteui-angular-performance/tsconfig.spec.json", + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "projects/igniteui-angular-performance/public" + } + ], + "styles": [ + "projects/igniteui-angular-performance/src/styles.scss" + ] + } + } + } } }, "cli": { diff --git a/package.json b/package.json index c5829e62c46..337d4755b1a 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "ng": "ng", "start": "ng serve --open --hmr", "start:elements": "ng serve --project igniteui-angular-elements", + "start:performance": "ng serve --project igniteui-angular-performance", "build": "ng build --configuration production", "test": "ng test igniteui-angular", "lint": "ng lint", diff --git a/projects/igniteui-angular-performance/public/favicon.ico b/projects/igniteui-angular-performance/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..57614f9c967596fad0a3989bec2b1deff33034f6 GIT binary patch literal 15086 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 Nr__JTFzvMr^FKp4S3v*( literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/app/app.component.html b/projects/igniteui-angular-performance/src/app/app.component.html new file mode 100644 index 00000000000..13960a4a92d --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/app.component.html @@ -0,0 +1,8 @@ +
+
+ + + +
+ +
diff --git a/projects/igniteui-angular-performance/src/app/app.component.scss b/projects/igniteui-angular-performance/src/app/app.component.scss new file mode 100644 index 00000000000..888a906b67e --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/app.component.scss @@ -0,0 +1,18 @@ +:host { + width: 100%; + height: 100%; + display: flex; +} + +.wrapper { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; +} + +.routes { + padding: 1rem; + display: flex; + gap: 1rem; +} diff --git a/projects/igniteui-angular-performance/src/app/app.component.spec.ts b/projects/igniteui-angular-performance/src/app/app.component.spec.ts new file mode 100644 index 00000000000..c7baa22fc4d --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/app.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + let component: AppComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AppComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(AppComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/igniteui-angular-performance/src/app/app.component.ts b/projects/igniteui-angular-performance/src/app/app.component.ts new file mode 100644 index 00000000000..079b0d65066 --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/app.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; +import { RouterLink, RouterOutlet } from '@angular/router'; +import { IgxButtonDirective } from 'igniteui-angular'; + +@Component({ + selector: 'app-root', + imports: [RouterOutlet, IgxButtonDirective, RouterLink], + templateUrl: './app.component.html', + styleUrl: './app.component.scss' +}) +export class AppComponent { + +} diff --git a/projects/igniteui-angular-performance/src/app/app.config.ts b/projects/igniteui-angular-performance/src/app/app.config.ts new file mode 100644 index 00000000000..68c90364260 --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/app.config.ts @@ -0,0 +1,14 @@ +import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; +import { provideRouter } from '@angular/router'; +import { provideAnimations } from '@angular/platform-browser/animations'; + +import { routes } from './app.routes'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(routes), + provideAnimations() + ] +}; diff --git a/projects/igniteui-angular-performance/src/app/app.routes.ts b/projects/igniteui-angular-performance/src/app/app.routes.ts new file mode 100644 index 00000000000..901abff8c93 --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/app.routes.ts @@ -0,0 +1,21 @@ +import { Routes } from '@angular/router'; +import { GridComponent } from './grid/grid.component'; + +export const routes: Routes = [ + { + path: "grid-100k", + component: GridComponent, + data: { rows: 100_000 } + }, + { + path: "grid-1m", + component: GridComponent, + data: { rows: 1_000_000 } + }, + { + path: "", + pathMatch: 'full', + component: GridComponent, + data: { rows: 1000 } + } +]; diff --git a/projects/igniteui-angular-performance/src/app/data/athletesData.ts b/projects/igniteui-angular-performance/src/app/data/athletesData.ts new file mode 100644 index 00000000000..f16f6c3f103 --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/data/athletesData.ts @@ -0,0 +1,2037 @@ +/* eslint-disable */ +export const DATA = [{ + "Id": 84, + "Avatar": "assets/images/men/12.jpg", + "Position": "current", + "Name": "Abel Brun", + "AthleteNumber": 39315, + "NetWorth": 105, + "TopSpeed": 5.1, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/af.png", + "CountryName": "Afghanistan" +}, { + "Id": 65, + "Avatar": "assets/images/women/60.jpg", + "Position": "down", + "Name": "Keira Walker", + "AthleteNumber": 34116, + "NetWorth": 94, + "TopSpeed": 4.8, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/al.png", + "CountryName": "Albania" +}, { + "Id": 197, + "Avatar": "assets/images/men/93.jpg", + "Position": "current", + "Name": "Brent Lord", + "AthleteNumber": 20943, + "NetWorth": 92, + "TopSpeed": 4.8, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/dz.png", + "CountryName": "Algeria" +}, { + "Id": 66, + "Avatar": "assets/images/men/70.jpg", + "Position": "down", + "Name": "Moritz Braun", + "AthleteNumber": 48081, + "NetWorth": 107, + "TopSpeed": 6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/ad.png", + "CountryName": "Andorra" +}, { + "Id": 58, + "Avatar": "assets/images/women/60.jpg", + "Position": "down", + "Name": "Zaina Pomp", + "AthleteNumber": 14109, + "NetWorth": 90, + "TopSpeed": 5.7, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ao.png", + "CountryName": "Angola" +}, { + "Id": 40, + "Avatar": "assets/images/men/33.jpg", + "Position": "down", + "Name": "Alberto Clark", + "AthleteNumber": 29912, + "NetWorth": 93, + "TopSpeed": 4.6, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ag.png", + "CountryName": "Antigua and Barbuda" +}, { + "Id": 138, + "Avatar": "assets/images/men/38.jpg", + "Position": "current", + "Name": "Derrick Price", + "AthleteNumber": 19792, + "NetWorth": 94, + "TopSpeed": 5.6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/ar.png", + "CountryName": "Argentina" +}, { + "Id": 6, + "Avatar": "assets/images/women/26.jpg", + "Position": "up", + "Name": "Mira Campos", + "AthleteNumber": 39222, + "NetWorth": 95, + "TopSpeed": 5.9, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/am.png", + "CountryName": "Armenia" +}, { + "Id": 190, + "Avatar": "assets/images/women/44.jpg", + "Position": "current", + "Name": "Kiara Dubois", + "AthleteNumber": 49964, + "NetWorth": 97, + "TopSpeed": 5.6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/au.png", + "CountryName": "Australia" +}, { + "Id": 168, + "Avatar": "assets/images/men/10.jpg", + "Position": "current", + "Name": "Calvin Hunt", + "AthleteNumber": 35535, + "NetWorth": 94, + "TopSpeed": 4.5, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/at.png", + "CountryName": "Austria" +}, { + "Id": 105, + "Avatar": "assets/images/men/5.jpg", + "Position": "down", + "Name": "Samu Hokkanen", + "AthleteNumber": 22469, + "NetWorth": 106, + "TopSpeed": 5.5, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/az.png", + "CountryName": "Azerbaijan" +}, { + "Id": 33, + "Avatar": "assets/images/men/18.jpg", + "Position": "up", + "Name": "Zackary Roy", + "AthleteNumber": 45996, + "NetWorth": 92, + "TopSpeed": 4.9, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/bs.png", + "CountryName": "Bahamas" +}, { + "Id": 83, + "Avatar": "assets/images/men/10.jpg", + "Position": "current", + "Name": "سینا مرادی", + "AthleteNumber": 10809, + "NetWorth": 105, + "TopSpeed": 5.3, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/bh.png", + "CountryName": "Bahrain" +}, { + "Id": 121, + "Avatar": "assets/images/men/45.jpg", + "Position": "current", + "Name": "Maurice Lambert", + "AthleteNumber": 17443, + "NetWorth": 96, + "TopSpeed": 5.6, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/bd.png", + "CountryName": "Bangladesh" +}, { + "Id": 111, + "Avatar": "assets/images/men/23.jpg", + "Position": "up", + "Name": "Connor Green", + "AthleteNumber": 44716, + "NetWorth": 95, + "TopSpeed": 4.4, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/bb.png", + "CountryName": "Barbados" +}, { + "Id": 75, + "Avatar": "assets/images/women/69.jpg", + "Position": "current", + "Name": "Ellen Leppo", + "AthleteNumber": 29286, + "NetWorth": 97, + "TopSpeed": 5.6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/by.png", + "CountryName": "Belarus" +}, { + "Id": 68, + "Avatar": "assets/images/men/23.jpg", + "Position": "up", + "Name": "Sandro Carpentier", + "AthleteNumber": 23503, + "NetWorth": 96, + "TopSpeed": 5.7, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/be.png", + "CountryName": "Belgium" +}, { + "Id": 150, + "Avatar": "assets/images/men/52.jpg", + "Position": "up", + "Name": "Gustav Petersen", + "AthleteNumber": 20984, + "NetWorth": 107, + "TopSpeed": 4.6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/bz.png", + "CountryName": "Belize" +}, { + "Id": 142, + "Avatar": "assets/images/women/63.jpg", + "Position": "current", + "Name": "Nicoline Thomsen", + "AthleteNumber": 36778, + "NetWorth": 99, + "TopSpeed": 5.5, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/bj.png", + "CountryName": "Benin" +}, { + "Id": 19, + "Avatar": "assets/images/women/6.jpg", + "Position": "current", + "Name": "Sedef Tunçeri", + "AthleteNumber": 48164, + "NetWorth": 108, + "TopSpeed": 5.6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/bt.png", + "CountryName": "Bhutan" +}, { + "Id": 202, + "Avatar": "assets/images/women/92.jpg", + "Position": "down", + "Name": "Ilona Salonen", + "AthleteNumber": 27068, + "NetWorth": 91, + "TopSpeed": 5.4, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/bo.png", + "CountryName": "Bolivia" +}, { + "Id": 191, + "Avatar": "assets/images/women/72.jpg", + "Position": "up", + "Name": "Clarisse Rey", + "AthleteNumber": 29795, + "NetWorth": 98, + "TopSpeed": 4.9, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ba.png", + "CountryName": "Bosnia and Herzegovina" +}, { + "Id": 71, + "Avatar": "assets/images/men/74.jpg", + "Position": "down", + "Name": "Jimmie Mcguinness", + "AthleteNumber": 20729, + "NetWorth": 90, + "TopSpeed": 4.6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/bw.png", + "CountryName": "Botswana" +}, { + "Id": 82, + "Avatar": "assets/images/men/55.jpg", + "Position": "current", + "Name": "Johann Fischer", + "AthleteNumber": 37212, + "NetWorth": 98, + "TopSpeed": 5.8, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/br.png", + "CountryName": "Brazil" +}, { + "Id": 121, + "Avatar": "assets/images/men/31.jpg", + "Position": "down", + "Name": "Ivan Ivanov", + "AthleteNumber": 11054, + "NetWorth": 108, + "TopSpeed": 5.7, + "TrackProgress": 5, + "CountryFlag": "assets/images/flags/bg.png", + "CountryName": "Bulgaria" +}, { + "Id": 144, + "Avatar": "assets/images/women/57.jpg", + "Position": "down", + "Name": "Milja Leino", + "AthleteNumber": 33563, + "NetWorth": 110, + "TopSpeed": 4.1, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/bf.png", + "CountryName": "Burkina Faso" +}, { + "Id": 71, + "Avatar": "assets/images/men/81.jpg", + "Position": "down", + "Name": "آراد جعفری", + "AthleteNumber": 34962, + "NetWorth": 90, + "TopSpeed": 4.8, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/bi.png", + "CountryName": "Burundi" +}, { + "Id": 163, + "Avatar": "assets/images/women/21.jpg", + "Position": "up", + "Name": "Pippa Roberts", + "AthleteNumber": 15588, + "NetWorth": 105, + "TopSpeed": 4.1, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/kh.png", + "CountryName": "Cambodia" +}, { + "Id": 122, + "Avatar": "assets/images/men/57.jpg", + "Position": "down", + "Name": "Jack Jean-baptiste", + "AthleteNumber": 40427, + "NetWorth": 110, + "TopSpeed": 4.3, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/cm.png", + "CountryName": "Cameroon" +}, { + "Id": 199, + "Avatar": "assets/images/women/68.jpg", + "Position": "up", + "Name": "Lucie Dumont", + "AthleteNumber": 12104, + "NetWorth": 108, + "TopSpeed": 4, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ca.png", + "CountryName": "Canada" +}, { + "Id": 136, + "Avatar": "assets/images/women/10.jpg", + "Position": "down", + "Name": "Elaine Matthews", + "AthleteNumber": 38574, + "NetWorth": 110, + "TopSpeed": 5.5, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/cv.png", + "CountryName": "Cape Verde" +}, { + "Id": 70, + "Avatar": "assets/images/women/14.jpg", + "Position": "up", + "Name": "Emily Olsen", + "AthleteNumber": 13887, + "NetWorth": 110, + "TopSpeed": 4.8, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/cf.png", + "CountryName": "Central African Republic" +}, { + "Id": 21, + "Avatar": "assets/images/men/73.jpg", + "Position": "down", + "Name": "Kuzey Aclan", + "AthleteNumber": 18583, + "NetWorth": 102, + "TopSpeed": 5.3, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/td.png", + "CountryName": "Chad" +}, { + "Id": 86, + "Avatar": "assets/images/women/82.jpg", + "Position": "current", + "Name": "Eloida Novaes", + "AthleteNumber": 30751, + "NetWorth": 107, + "TopSpeed": 4.2, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/cl.png", + "CountryName": "Chile" +}, { + "Id": 130, + "Avatar": "assets/images/women/24.jpg", + "Position": "down", + "Name": "آوا احمدی", + "AthleteNumber": 44347, + "NetWorth": 110, + "TopSpeed": 4.1, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/cn.png", + "CountryName": "China" +}, { + "Id": 127, + "Avatar": "assets/images/men/52.jpg", + "Position": "down", + "Name": "Gerardo Soto", + "AthleteNumber": 22958, + "NetWorth": 90, + "TopSpeed": 5, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/co.png", + "CountryName": "Colombia" +}, { + "Id": 125, + "Avatar": "assets/images/women/16.jpg", + "Position": "current", + "Name": "Altiva Alves", + "AthleteNumber": 31850, + "NetWorth": 106, + "TopSpeed": 5.1, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/km.png", + "CountryName": "Comoros" +}, { + "Id": 38, + "Avatar": "assets/images/women/17.jpg", + "Position": "current", + "Name": "Charlotte Meyer", + "AthleteNumber": 21442, + "NetWorth": 110, + "TopSpeed": 4.6, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/ck.png", + "CountryName": "Cook Islands" +}, { + "Id": 186, + "Avatar": "assets/images/men/42.jpg", + "Position": "up", + "Name": "Jimmy Bailey", + "AthleteNumber": 38510, + "NetWorth": 101, + "TopSpeed": 4.7, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/cr.png", + "CountryName": "Costa Rica" +}, { + "Id": 108, + "Avatar": "assets/images/men/31.jpg", + "Position": "up", + "Name": "Noah Bergeron", + "AthleteNumber": 35139, + "NetWorth": 110, + "TopSpeed": 5.6, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ci.png", + "CountryName": "Cote DIvoire" +}, { + "Id": 176, + "Avatar": "assets/images/men/35.jpg", + "Position": "down", + "Name": "Laudelino Castro", + "AthleteNumber": 12711, + "NetWorth": 106, + "TopSpeed": 4.4, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/hr.png", + "CountryName": "Croatia" +}, { + "Id": 138, + "Avatar": "assets/images/men/78.jpg", + "Position": "current", + "Name": "Oscar Calvo", + "AthleteNumber": 45078, + "NetWorth": 109, + "TopSpeed": 4.3, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/cu.png", + "CountryName": "Cuba" +}, { + "Id": 137, + "Avatar": "assets/images/men/80.jpg", + "Position": "down", + "Name": "Lance Dunn", + "AthleteNumber": 10113, + "NetWorth": 94, + "TopSpeed": 4.5, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/cy.png", + "CountryName": "Cyprus" +}, { + "Id": 173, + "Avatar": "assets/images/women/18.jpg", + "Position": "current", + "Name": "Hassana Camp", + "AthleteNumber": 14467, + "NetWorth": 104, + "TopSpeed": 5.2, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/cz.png", + "CountryName": "Czech Republic" +}, { + "Id": 46, + "Avatar": "assets/images/women/55.jpg", + "Position": "current", + "Name": "Ronja Kraft", + "AthleteNumber": 21800, + "NetWorth": 101, + "TopSpeed": 5.3, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/dk.png", + "CountryName": "Denmark" +}, { + "Id": 8, + "Avatar": "assets/images/men/14.jpg", + "Position": "up", + "Name": "Hans Möller", + "AthleteNumber": 34122, + "NetWorth": 109, + "TopSpeed": 5.6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/dj.png", + "CountryName": "Djibouti" +}, { + "Id": 188, + "Avatar": "assets/images/women/45.jpg", + "Position": "down", + "Name": "Ceylan Duygulu", + "AthleteNumber": 21527, + "NetWorth": 99, + "TopSpeed": 4.9, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/dm.png", + "CountryName": "Dominica" +}, { + "Id": 134, + "Avatar": "assets/images/women/66.jpg", + "Position": "down", + "Name": "Anni Waisanen", + "AthleteNumber": 32133, + "NetWorth": 99, + "TopSpeed": 5, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/do.png", + "CountryName": "Dominican Republic" +}, { + "Id": 112, + "Avatar": "assets/images/women/53.jpg", + "Position": "down", + "Name": "Karen Shaw", + "AthleteNumber": 31048, + "NetWorth": 107, + "TopSpeed": 5.7, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ec.png", + "CountryName": "Ecuador" +}, { + "Id": 161, + "Avatar": "assets/images/men/38.jpg", + "Position": "current", + "Name": "Alex Martin", + "AthleteNumber": 27887, + "NetWorth": 96, + "TopSpeed": 4.2, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/eg.png", + "CountryName": "Egypt" +}, { + "Id": 196, + "Avatar": "assets/images/women/30.jpg", + "Position": "up", + "Name": "Begüm Erkekli", + "AthleteNumber": 37888, + "NetWorth": 104, + "TopSpeed": 4.6, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/sv.png", + "CountryName": "El Salvador" +}, { + "Id": 24, + "Avatar": "assets/images/men/0.jpg", + "Position": "down", + "Name": "Joan Ortega", + "AthleteNumber": 49478, + "NetWorth": 103, + "TopSpeed": 5.4, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/gq.png", + "CountryName": "Equatorial Guinea" +}, { + "Id": 174, + "Avatar": "assets/images/women/29.jpg", + "Position": "current", + "Name": "Beatriz Gallardo", + "AthleteNumber": 38538, + "NetWorth": 101, + "TopSpeed": 6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/er.png", + "CountryName": "Eritrea" +}, { + "Id": 193, + "Avatar": "assets/images/women/59.jpg", + "Position": "down", + "Name": "Sophia Carlson", + "AthleteNumber": 44183, + "NetWorth": 102, + "TopSpeed": 5.1, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ee.png", + "CountryName": "Estonia" +}, { + "Id": 85, + "Avatar": "assets/images/men/43.jpg", + "Position": "down", + "Name": "Niilo Laurila", + "AthleteNumber": 49215, + "NetWorth": 104, + "TopSpeed": 4.5, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/et.png", + "CountryName": "Ethiopia" +}, { + "Id": 201, + "Avatar": "assets/images/men/92.jpg", + "Position": "up", + "Name": "Kaya Tekand", + "AthleteNumber": 11028, + "NetWorth": 93, + "TopSpeed": 5.2, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/fj.png", + "CountryName": "Fiji" +}, { + "Id": 123, + "Avatar": "assets/images/men/31.jpg", + "Position": "current", + "Name": "Eeli Makinen", + "AthleteNumber": 45296, + "NetWorth": 106, + "TopSpeed": 5.2, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/fi.png", + "CountryName": "Finland" +}, { + "Id": 16, + "Avatar": "assets/images/men/72.jpg", + "Position": "down", + "Name": "Felix Olsen", + "AthleteNumber": 43198, + "NetWorth": 101, + "TopSpeed": 4.2, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/fr.png", + "CountryName": "France" +}, { + "Id": 62, + "Avatar": "assets/images/men/43.jpg", + "Position": "current", + "Name": "Roman Smith", + "AthleteNumber": 15531, + "NetWorth": 106, + "TopSpeed": 4.9, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/ga.png", + "CountryName": "Gabon" +}, { + "Id": 69, + "Avatar": "assets/images/men/17.jpg", + "Position": "current", + "Name": "Emil Meißner", + "AthleteNumber": 37183, + "NetWorth": 97, + "TopSpeed": 4, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/gm.png", + "CountryName": "Gambia" +}, { + "Id": 182, + "Avatar": "assets/images/men/94.jpg", + "Position": "current", + "Name": "Gerald Schmidt", + "AthleteNumber": 47410, + "NetWorth": 102, + "TopSpeed": 5.8, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/ge.png", + "CountryName": "Georgia" +}, { + "Id": 190, + "Avatar": "assets/images/women/53.jpg", + "Position": "current", + "Name": "Gladys Van Der Steeg", + "AthleteNumber": 20216, + "NetWorth": 94, + "TopSpeed": 4.3, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/de.png", + "CountryName": "Germany" +}, { + "Id": 100, + "Avatar": "assets/images/women/20.jpg", + "Position": "current", + "Name": "Alexis Walker", + "AthleteNumber": 43183, + "NetWorth": 103, + "TopSpeed": 5.8, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/gh.png", + "CountryName": "Ghana" +}, { + "Id": 85, + "Avatar": "assets/images/men/34.jpg", + "Position": "current", + "Name": "Jeffrey Medina", + "AthleteNumber": 42905, + "NetWorth": 100, + "TopSpeed": 5.2, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/gr.png", + "CountryName": "Greece" +}, { + "Id": 169, + "Avatar": "assets/images/men/21.jpg", + "Position": "down", + "Name": "Julian Barth", + "AthleteNumber": 19011, + "NetWorth": 91, + "TopSpeed": 5.2, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/gd.png", + "CountryName": "Grenada" +}, { + "Id": 116, + "Avatar": "assets/images/women/1.jpg", + "Position": "down", + "Name": "Sevcan Kollen", + "AthleteNumber": 13728, + "NetWorth": 104, + "TopSpeed": 5.3, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/gt.png", + "CountryName": "Guatemala" +}, { + "Id": 75, + "Avatar": "assets/images/men/88.jpg", + "Position": "down", + "Name": "Rafael Gutierrez", + "AthleteNumber": 38804, + "NetWorth": 100, + "TopSpeed": 5.9, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/gn.png", + "CountryName": "Guinea" +}, { + "Id": 121, + "Avatar": "assets/images/men/48.jpg", + "Position": "current", + "Name": "Väinö Salmi", + "AthleteNumber": 29839, + "NetWorth": 107, + "TopSpeed": 5.5, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/gw.png", + "CountryName": "Guinea-Bissau" +}, { + "Id": 180, + "Avatar": "assets/images/women/90.jpg", + "Position": "up", + "Name": "Lillian Bowman", + "AthleteNumber": 35323, + "NetWorth": 103, + "TopSpeed": 4.5, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/gy.png", + "CountryName": "Guyana" +}, { + "Id": 139, + "Avatar": "assets/images/women/28.jpg", + "Position": "current", + "Name": "Annabell Barth", + "AthleteNumber": 41130, + "NetWorth": 103, + "TopSpeed": 5, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/ht.png", + "CountryName": "Haiti" +}, { + "Id": 4, + "Avatar": "assets/images/men/34.jpg", + "Position": "down", + "Name": "Mathys Martin", + "AthleteNumber": 32928, + "NetWorth": 98, + "TopSpeed": 5.5, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/va.png", + "CountryName": "Holy See (Vatican City State)" +}, { + "Id": 1, + "Avatar": "assets/images/men/65.jpg", + "Position": "down", + "Name": "Louis Stewart", + "AthleteNumber": 48131, + "NetWorth": 103, + "TopSpeed": 5.7, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/hn.png", + "CountryName": "Honduras" +}, { + "Id": 190, + "Avatar": "assets/images/women/2.jpg", + "Position": "current", + "Name": "Venla Korpela", + "AthleteNumber": 16454, + "NetWorth": 92, + "TopSpeed": 4.1, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/hu.png", + "CountryName": "Hungary" +}, { + "Id": 167, + "Avatar": "assets/images/men/81.jpg", + "Position": "down", + "Name": "Milo Charles", + "AthleteNumber": 10661, + "NetWorth": 99, + "TopSpeed": 5.4, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/is.png", + "CountryName": "Iceland" +}, { + "Id": 62, + "Avatar": "assets/images/men/9.jpg", + "Position": "current", + "Name": "Anthony Harcourt", + "AthleteNumber": 33649, + "NetWorth": 109, + "TopSpeed": 5.5, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/in.png", + "CountryName": "India" +}, { + "Id": 72, + "Avatar": "assets/images/men/31.jpg", + "Position": "up", + "Name": "Aaron Robertson", + "AthleteNumber": 30727, + "NetWorth": 95, + "TopSpeed": 4.2, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/id.png", + "CountryName": "Indonesia" +}, { + "Id": 2, + "Avatar": "assets/images/men/14.jpg", + "Position": "up", + "Name": "Bill Fox", + "AthleteNumber": 18511, + "NetWorth": 91, + "TopSpeed": 5, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/ir.png", + "CountryName": "Iran, Islamic Republic Of" +}, { + "Id": 58, + "Avatar": "assets/images/women/30.jpg", + "Position": "up", + "Name": "Veera Saari", + "AthleteNumber": 40408, + "NetWorth": 100, + "TopSpeed": 4.7, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/iq.png", + "CountryName": "Iraq" +}, { + "Id": 87, + "Avatar": "assets/images/men/35.jpg", + "Position": "current", + "Name": "Loïc Gerard", + "AthleteNumber": 31706, + "NetWorth": 102, + "TopSpeed": 4.4, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ie.png", + "CountryName": "Ireland" +}, { + "Id": 137, + "Avatar": "assets/images/women/75.jpg", + "Position": "up", + "Name": "Gloria Caballero", + "AthleteNumber": 43379, + "NetWorth": 103, + "TopSpeed": 4.3, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/il.png", + "CountryName": "Israel" +}, { + "Id": 5, + "Avatar": "assets/images/women/38.jpg", + "Position": "current", + "Name": "Gianne Godijn", + "AthleteNumber": 45945, + "NetWorth": 96, + "TopSpeed": 4.5, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/it.png", + "CountryName": "Italy" +}, { + "Id": 196, + "Avatar": "assets/images/women/17.jpg", + "Position": "current", + "Name": "Parel Zuidhof", + "AthleteNumber": 32718, + "NetWorth": 105, + "TopSpeed": 5, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/jm.png", + "CountryName": "Jamaica" +}, { + "Id": 23, + "Avatar": "assets/images/men/72.jpg", + "Position": "down", + "Name": "Gökhan Aşıkoğlu", + "AthleteNumber": 13890, + "NetWorth": 105, + "TopSpeed": 5.4, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/jp.png", + "CountryName": "Japan" +}, { + "Id": 74, + "Avatar": "assets/images/women/9.jpg", + "Position": "up", + "Name": "Minea Rantanen", + "AthleteNumber": 18835, + "NetWorth": 105, + "TopSpeed": 5, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/jo.png", + "CountryName": "Jordan" +}, { + "Id": 92, + "Avatar": "assets/images/women/4.jpg", + "Position": "down", + "Name": "Asta Hansen", + "AthleteNumber": 17222, + "NetWorth": 101, + "TopSpeed": 4.3, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/kz.png", + "CountryName": "Kazakhstan" +}, { + "Id": 191, + "Avatar": "assets/images/women/13.jpg", + "Position": "up", + "Name": "Sheryl Collins", + "AthleteNumber": 36473, + "NetWorth": 98, + "TopSpeed": 4.2, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/ke.png", + "CountryName": "Kenya" +}, { + "Id": 166, + "Avatar": "assets/images/women/74.jpg", + "Position": "current", + "Name": "Maria Parra", + "AthleteNumber": 39861, + "NetWorth": 106, + "TopSpeed": 6, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ki.png", + "CountryName": "Kiribati" +}, { + "Id": 73, + "Avatar": "assets/images/women/33.jpg", + "Position": "up", + "Name": "Annabelle Besteman", + "AthleteNumber": 30560, + "NetWorth": 105, + "TopSpeed": 5.3, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/kp.png", + "CountryName": "Korea, Democratic PeopleS Republic of" +}, { + "Id": 182, + "Avatar": "assets/images/women/14.jpg", + "Position": "up", + "Name": "Ariena Achterberg", + "AthleteNumber": 41330, + "NetWorth": 92, + "TopSpeed": 5.6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/kr.png", + "CountryName": "Korea, Republic of" +}, { + "Id": 67, + "Avatar": "assets/images/men/50.jpg", + "Position": "current", + "Name": "Villads Larsen", + "AthleteNumber": 44677, + "NetWorth": 93, + "TopSpeed": 5.7, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/kw.png", + "CountryName": "Kuwait" +}, { + "Id": 110, + "Avatar": "assets/images/women/26.jpg", + "Position": "down", + "Name": "Emilie Morin", + "AthleteNumber": 26164, + "NetWorth": 98, + "TopSpeed": 4.9, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/kg.png", + "CountryName": "Kyrgyzstan" +}, { + "Id": 31, + "Avatar": "assets/images/men/56.jpg", + "Position": "up", + "Name": "Judd Campbell", + "AthleteNumber": 37365, + "NetWorth": 110, + "TopSpeed": 5, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/la.png", + "CountryName": "Lao PeopleS Democratic Republic" +}, { + "Id": 110, + "Avatar": "assets/images/women/13.jpg", + "Position": "current", + "Name": "Özsu Keçeci", + "AthleteNumber": 29403, + "NetWorth": 106, + "TopSpeed": 4.2, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/lv.png", + "CountryName": "Latvia" +}, { + "Id": 123, + "Avatar": "assets/images/women/12.jpg", + "Position": "up", + "Name": "آنیتا كامياران", + "AthleteNumber": 18980, + "NetWorth": 90, + "TopSpeed": 4.5, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/lb.png", + "CountryName": "Lebanon" +}, { + "Id": 138, + "Avatar": "assets/images/men/31.jpg", + "Position": "down", + "Name": "Antoine Mackay", + "AthleteNumber": 34547, + "NetWorth": 104, + "TopSpeed": 5, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ls.png", + "CountryName": "Lesotho" +}, { + "Id": 167, + "Avatar": "assets/images/men/19.jpg", + "Position": "down", + "Name": "Louis Smith", + "AthleteNumber": 31837, + "NetWorth": 98, + "TopSpeed": 5.4, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/lr.png", + "CountryName": "Liberia" +}, { + "Id": 29, + "Avatar": "assets/images/men/29.jpg", + "Position": "current", + "Name": "Selmo Caldeira", + "AthleteNumber": 21837, + "NetWorth": 110, + "TopSpeed": 4.9, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/ly.png", + "CountryName": "Libyan Arab Jamahiriya" +}, { + "Id": 35, + "Avatar": "assets/images/women/42.jpg", + "Position": "down", + "Name": "Elaine Smith", + "AthleteNumber": 38243, + "NetWorth": 108, + "TopSpeed": 4, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/li.png", + "CountryName": "Liechtenstein" +}, { + "Id": 75, + "Avatar": "assets/images/men/2.jpg", + "Position": "up", + "Name": "Fritz Sommer", + "AthleteNumber": 26210, + "NetWorth": 99, + "TopSpeed": 4.6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/lt.png", + "CountryName": "Lithuania" +}, { + "Id": 40, + "Avatar": "assets/images/men/5.jpg", + "Position": "down", + "Name": "Carter Evans", + "AthleteNumber": 46961, + "NetWorth": 100, + "TopSpeed": 5.3, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/lu.png", + "CountryName": "Luxembourg" +}, { + "Id": 183, + "Avatar": "assets/images/women/53.jpg", + "Position": "up", + "Name": "رونیکا سلطانی نژاد", + "AthleteNumber": 35233, + "NetWorth": 99, + "TopSpeed": 4.6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/mk.png", + "CountryName": "Macedonia, The Former Yugoslav Republic of" +}, { + "Id": 151, + "Avatar": "assets/images/women/88.jpg", + "Position": "current", + "Name": "Charlotte Mills", + "AthleteNumber": 49829, + "NetWorth": 92, + "TopSpeed": 5.3, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/mg.png", + "CountryName": "Madagascar" +}, { + "Id": 107, + "Avatar": "assets/images/men/33.jpg", + "Position": "up", + "Name": "Pedro Marquez", + "AthleteNumber": 16169, + "NetWorth": 97, + "TopSpeed": 5.4, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/mw.png", + "CountryName": "Malawi" +}, { + "Id": 65, + "Avatar": "assets/images/women/9.jpg", + "Position": "down", + "Name": "Jenny Burke", + "AthleteNumber": 15266, + "NetWorth": 99, + "TopSpeed": 5.4, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/my.png", + "CountryName": "Malaysia" +}, { + "Id": 155, + "Avatar": "assets/images/men/82.jpg", + "Position": "up", + "Name": "Justin Philippe", + "AthleteNumber": 12858, + "NetWorth": 104, + "TopSpeed": 5.7, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/mv.png", + "CountryName": "Maldives" +}, { + "Id": 165, + "Avatar": "assets/images/men/79.jpg", + "Position": "down", + "Name": "Mario Ellis", + "AthleteNumber": 18026, + "NetWorth": 99, + "TopSpeed": 5.5, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ml.png", + "CountryName": "Mali" +}, { + "Id": 107, + "Avatar": "assets/images/women/92.jpg", + "Position": "down", + "Name": "Megan Webb", + "AthleteNumber": 30713, + "NetWorth": 93, + "TopSpeed": 5.6, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/mt.png", + "CountryName": "Malta" +}, { + "Id": 52, + "Avatar": "assets/images/men/94.jpg", + "Position": "down", + "Name": "Adérito Lopes", + "AthleteNumber": 21320, + "NetWorth": 91, + "TopSpeed": 5.2, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/mh.png", + "CountryName": "Marshall Islands" +}, { + "Id": 99, + "Avatar": "assets/images/men/89.jpg", + "Position": "down", + "Name": "Victor Lévesque", + "AthleteNumber": 48375, + "NetWorth": 110, + "TopSpeed": 5.7, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/mr.png", + "CountryName": "Mauritania" +}, { + "Id": 188, + "Avatar": "assets/images/men/81.jpg", + "Position": "down", + "Name": "آراد یاسمی", + "AthleteNumber": 34370, + "NetWorth": 99, + "TopSpeed": 5.9, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/mu.png", + "CountryName": "Mauritius" +}, { + "Id": 10, + "Avatar": "assets/images/women/13.jpg", + "Position": "down", + "Name": "Maeva Bergeron", + "AthleteNumber": 15655, + "NetWorth": 94, + "TopSpeed": 5.9, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/mx.png", + "CountryName": "Mexico" +}, { + "Id": 41, + "Avatar": "assets/images/men/20.jpg", + "Position": "up", + "Name": "Oskari Karjala", + "AthleteNumber": 31498, + "NetWorth": 90, + "TopSpeed": 4.5, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/fm.png", + "CountryName": "Micronesia, Federated States of" +}, { + "Id": 51, + "Avatar": "assets/images/men/74.jpg", + "Position": "up", + "Name": "Alex Meyer", + "AthleteNumber": 44390, + "NetWorth": 94, + "TopSpeed": 4.3, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/md.png", + "CountryName": "Moldova, Republic of" +}, { + "Id": 128, + "Avatar": "assets/images/women/52.jpg", + "Position": "up", + "Name": "Sophie Lewis", + "AthleteNumber": 46222, + "NetWorth": 106, + "TopSpeed": 4.4, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/mc.png", + "CountryName": "Monaco" +}, { + "Id": 79, + "Avatar": "assets/images/women/39.jpg", + "Position": "current", + "Name": "Ashley Romero", + "AthleteNumber": 36611, + "NetWorth": 104, + "TopSpeed": 5.5, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/mn.png", + "CountryName": "Mongolia" +}, { + "Id": 124, + "Avatar": "assets/images/women/19.jpg", + "Position": "current", + "Name": "Marie Poulsen", + "AthleteNumber": 44113, + "NetWorth": 109, + "TopSpeed": 4.7, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/ma.png", + "CountryName": "Morocco" +}, { + "Id": 42, + "Avatar": "assets/images/women/83.jpg", + "Position": "down", + "Name": "Caitlin Jackson", + "AthleteNumber": 45472, + "NetWorth": 101, + "TopSpeed": 4.3, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/mz.png", + "CountryName": "Mozambique" +}, { + "Id": 15, + "Avatar": "assets/images/women/79.jpg", + "Position": "down", + "Name": "Marilou Hubert", + "AthleteNumber": 43655, + "NetWorth": 104, + "TopSpeed": 4.2, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/mm.png", + "CountryName": "Myanmar" +}, { + "Id": 63, + "Avatar": "assets/images/women/9.jpg", + "Position": "up", + "Name": "Estelle Vincent", + "AthleteNumber": 41700, + "NetWorth": 99, + "TopSpeed": 5.7, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/na.png", + "CountryName": "Namibia" +}, { + "Id": 154, + "Avatar": "assets/images/women/54.jpg", + "Position": "down", + "Name": "Rhonda Simmmons", + "AthleteNumber": 37139, + "NetWorth": 96, + "TopSpeed": 5.1, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/nr.png", + "CountryName": "Nauru" +}, { + "Id": 191, + "Avatar": "assets/images/men/42.jpg", + "Position": "current", + "Name": "آرش احمدی", + "AthleteNumber": 36948, + "NetWorth": 90, + "TopSpeed": 4.1, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/np.png", + "CountryName": "Nepal" +}, { + "Id": 141, + "Avatar": "assets/images/men/15.jpg", + "Position": "current", + "Name": "Miro Korpela", + "AthleteNumber": 40544, + "NetWorth": 104, + "TopSpeed": 5.3, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/nl.png", + "CountryName": "Netherlands" +}, { + "Id": 73, + "Avatar": "assets/images/women/4.jpg", + "Position": "up", + "Name": "Afet Kumcuoğlu", + "AthleteNumber": 33454, + "NetWorth": 106, + "TopSpeed": 5.1, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/nz.png", + "CountryName": "New Zealand" +}, { + "Id": 163, + "Avatar": "assets/images/women/52.jpg", + "Position": "up", + "Name": "Millie Cooper", + "AthleteNumber": 14610, + "NetWorth": 99, + "TopSpeed": 5.4, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/ni.png", + "CountryName": "Nicaragua" +}, { + "Id": 53, + "Avatar": "assets/images/women/51.jpg", + "Position": "current", + "Name": "Kayla Patel", + "AthleteNumber": 42780, + "NetWorth": 103, + "TopSpeed": 4.7, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/ne.png", + "CountryName": "Niger" +}, { + "Id": 58, + "Avatar": "assets/images/men/31.jpg", + "Position": "current", + "Name": "Diego Gautier", + "AthleteNumber": 26320, + "NetWorth": 97, + "TopSpeed": 4.6, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ng.png", + "CountryName": "Nigeria" +}, { + "Id": 186, + "Avatar": "assets/images/men/2.jpg", + "Position": "up", + "Name": "کوروش کامروا", + "AthleteNumber": 13506, + "NetWorth": 109, + "TopSpeed": 4.4, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/nu.png", + "CountryName": "Niue" +}, { + "Id": 101, + "Avatar": "assets/images/women/71.jpg", + "Position": "down", + "Name": "Lavínia Silva", + "AthleteNumber": 33994, + "NetWorth": 93, + "TopSpeed": 5.6, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/no.png", + "CountryName": "Norway" +}, { + "Id": 194, + "Avatar": "assets/images/men/71.jpg", + "Position": "down", + "Name": "Adrian Ibañez", + "AthleteNumber": 21968, + "NetWorth": 105, + "TopSpeed": 5.3, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/om.png", + "CountryName": "Oman" +}, { + "Id": 143, + "Avatar": "assets/images/men/38.jpg", + "Position": "up", + "Name": "رضا کوتی", + "AthleteNumber": 13640, + "NetWorth": 103, + "TopSpeed": 4.2, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/pk.png", + "CountryName": "Pakistan" +}, { + "Id": 37, + "Avatar": "assets/images/men/86.jpg", + "Position": "down", + "Name": "Clyde Matthews", + "AthleteNumber": 11955, + "NetWorth": 93, + "TopSpeed": 5.2, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/pw.png", + "CountryName": "Palau" +}, { + "Id": 176, + "Avatar": "assets/images/men/26.jpg", + "Position": "current", + "Name": "Tim Neal", + "AthleteNumber": 45860, + "NetWorth": 97, + "TopSpeed": 5.6, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/pa.png", + "CountryName": "Panama" +}, { + "Id": 110, + "Avatar": "assets/images/women/15.jpg", + "Position": "current", + "Name": "Annabell Brand", + "AthleteNumber": 39233, + "NetWorth": 93, + "TopSpeed": 5.7, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/pg.png", + "CountryName": "Papua New Guinea" +}, { + "Id": 188, + "Avatar": "assets/images/men/3.jpg", + "Position": "current", + "Name": "Foppe Delfos", + "AthleteNumber": 39679, + "NetWorth": 107, + "TopSpeed": 4.1, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/py.png", + "CountryName": "Paraguay" +}, { + "Id": 43, + "Avatar": "assets/images/men/42.jpg", + "Position": "up", + "Name": "Kent Clark", + "AthleteNumber": 32799, + "NetWorth": 106, + "TopSpeed": 5.7, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/pe.png", + "CountryName": "Peru" +}, { + "Id": 167, + "Avatar": "assets/images/women/32.jpg", + "Position": "current", + "Name": "Esma Adıvar", + "AthleteNumber": 35565, + "NetWorth": 99, + "TopSpeed": 4.2, + "TrackProgress": 5, + "CountryFlag": "assets/images/flags/ph.png", + "CountryName": "Philippines" +}, { + "Id": 123, + "Avatar": "assets/images/women/19.jpg", + "Position": "down", + "Name": "Flora Perez", + "AthleteNumber": 23907, + "NetWorth": 102, + "TopSpeed": 5.8, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/pl.png", + "CountryName": "Poland" +}, { + "Id": 76, + "Avatar": "assets/images/men/65.jpg", + "Position": "current", + "Name": "David Scott", + "AthleteNumber": 46997, + "NetWorth": 101, + "TopSpeed": 4.4, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/pt.png", + "CountryName": "Portugal" +}, { + "Id": 183, + "Avatar": "assets/images/men/74.jpg", + "Position": "down", + "Name": "Yarno Kin", + "AthleteNumber": 47324, + "NetWorth": 107, + "TopSpeed": 5.1, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ro.png", + "CountryName": "Romania" +}, { + "Id": 8, + "Avatar": "assets/images/women/15.jpg", + "Position": "down", + "Name": "Esther Kühn", + "AthleteNumber": 24868, + "NetWorth": 92, + "TopSpeed": 5.5, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/ru.png", + "CountryName": "Russian Federation" +}, { + "Id": 80, + "Avatar": "assets/images/men/90.jpg", + "Position": "down", + "Name": "Cecil Nichols", + "AthleteNumber": 20656, + "NetWorth": 100, + "TopSpeed": 5, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/rw.png", + "CountryName": "RWANDA" +}, { + "Id": 41, + "Avatar": "assets/images/women/65.jpg", + "Position": "down", + "Name": "Lilly Keuter", + "AthleteNumber": 49893, + "NetWorth": 102, + "TopSpeed": 4.5, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/kn.png", + "CountryName": "Saint Kitts and Nevis" +}, { + "Id": 200, + "Avatar": "assets/images/women/73.jpg", + "Position": "current", + "Name": "Alice Perry", + "AthleteNumber": 23750, + "NetWorth": 104, + "TopSpeed": 5.3, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/lc.png", + "CountryName": "Saint Lucia" +}, { + "Id": 51, + "Avatar": "assets/images/women/34.jpg", + "Position": "down", + "Name": "Eléa Robin", + "AthleteNumber": 26742, + "NetWorth": 90, + "TopSpeed": 4.7, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/vc.png", + "CountryName": "Saint Vincent and the Grenadines" +}, { + "Id": 163, + "Avatar": "assets/images/men/70.jpg", + "Position": "down", + "Name": "میلاد قاسمی", + "AthleteNumber": 12788, + "NetWorth": 101, + "TopSpeed": 4.1, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/ws.png", + "CountryName": "Samoa" +}, { + "Id": 72, + "Avatar": "assets/images/women/26.jpg", + "Position": "down", + "Name": "Sélène Roussel", + "AthleteNumber": 11261, + "NetWorth": 99, + "TopSpeed": 5.8, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/sm.png", + "CountryName": "San Marino" +}, { + "Id": 159, + "Avatar": "assets/images/women/66.jpg", + "Position": "up", + "Name": "Eva Dean", + "AthleteNumber": 48874, + "NetWorth": 103, + "TopSpeed": 5.7, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/st.png", + "CountryName": "Sao Tome and Principe" +}, { + "Id": 12, + "Avatar": "assets/images/women/83.jpg", + "Position": "up", + "Name": "Sara Larsen", + "AthleteNumber": 37094, + "NetWorth": 97, + "TopSpeed": 4.5, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/sa.png", + "CountryName": "Saudi Arabia" +}, { + "Id": 194, + "Avatar": "assets/images/men/11.jpg", + "Position": "down", + "Name": "Kaya Taşlı", + "AthleteNumber": 42291, + "NetWorth": 100, + "TopSpeed": 4.7, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/sn.png", + "CountryName": "Senegal" +}, { + "Id": 162, + "Avatar": "assets/images/men/5.jpg", + "Position": "down", + "Name": "Adam Bouchard", + "AthleteNumber": 38672, + "NetWorth": 99, + "TopSpeed": 4.7, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/sc.png", + "CountryName": "Seychelles" +}, { + "Id": 96, + "Avatar": "assets/images/women/37.jpg", + "Position": "up", + "Name": "Thea Edwards", + "AthleteNumber": 29141, + "NetWorth": 99, + "TopSpeed": 5.8, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/sl.png", + "CountryName": "Sierra Leone" +}, { + "Id": 93, + "Avatar": "assets/images/women/90.jpg", + "Position": "current", + "Name": "Ana Bourgeois", + "AthleteNumber": 24612, + "NetWorth": 110, + "TopSpeed": 6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/sg.png", + "CountryName": "Singapore" +}, { + "Id": 27, + "Avatar": "assets/images/women/61.jpg", + "Position": "up", + "Name": "Layla Douglas", + "AthleteNumber": 21977, + "NetWorth": 97, + "TopSpeed": 5.4, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/si.png", + "CountryName": "Slovenia" +}, { + "Id": 178, + "Avatar": "assets/images/women/65.jpg", + "Position": "down", + "Name": "Lillian Wade", + "AthleteNumber": 10729, + "NetWorth": 110, + "TopSpeed": 4.8, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/sb.png", + "CountryName": "Solomon Islands" +}, { + "Id": 192, + "Avatar": "assets/images/women/44.jpg", + "Position": "down", + "Name": "Viivi Kujala", + "AthleteNumber": 29939, + "NetWorth": 93, + "TopSpeed": 4.1, + "TrackProgress": 5, + "CountryFlag": "assets/images/flags/so.png", + "CountryName": "Somalia" +}, { + "Id": 87, + "Avatar": "assets/images/women/72.jpg", + "Position": "up", + "Name": "Charlotte Dean", + "AthleteNumber": 45969, + "NetWorth": 105, + "TopSpeed": 5, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/za.png", + "CountryName": "South Africa" +}, { + "Id": 86, + "Avatar": "assets/images/women/45.jpg", + "Position": "down", + "Name": "Marisvalda Martins", + "AthleteNumber": 33879, + "NetWorth": 107, + "TopSpeed": 5.4, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/es.png", + "CountryName": "Spain" +}, { + "Id": 129, + "Avatar": "assets/images/women/34.jpg", + "Position": "up", + "Name": "Ella Hansen", + "AthleteNumber": 27075, + "NetWorth": 101, + "TopSpeed": 5.1, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/lk.png", + "CountryName": "Sri Lanka" +}, { + "Id": 27, + "Avatar": "assets/images/men/9.jpg", + "Position": "current", + "Name": "Johann Hinz", + "AthleteNumber": 48244, + "NetWorth": 94, + "TopSpeed": 4.3, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/sd.png", + "CountryName": "Sudan" +}, { + "Id": 113, + "Avatar": "assets/images/men/37.jpg", + "Position": "current", + "Name": "Nick Naumann", + "AthleteNumber": 25566, + "NetWorth": 109, + "TopSpeed": 5.9, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/sz.png", + "CountryName": "Swaziland" +}, { + "Id": 194, + "Avatar": "assets/images/women/62.jpg", + "Position": "up", + "Name": "آوا سلطانی نژاد", + "AthleteNumber": 45635, + "NetWorth": 98, + "TopSpeed": 4.1, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/se.png", + "CountryName": "Sweden" +}, { + "Id": 65, + "Avatar": "assets/images/women/47.jpg", + "Position": "current", + "Name": "Ilke Kisters", + "AthleteNumber": 23817, + "NetWorth": 100, + "TopSpeed": 5.9, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/ch.png", + "CountryName": "Switzerland" +}, { + "Id": 162, + "Avatar": "assets/images/women/0.jpg", + "Position": "current", + "Name": "Alex Craig", + "AthleteNumber": 21868, + "NetWorth": 94, + "TopSpeed": 4.2, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/sy.png", + "CountryName": "Syrian Arab Republic" +}, { + "Id": 161, + "Avatar": "assets/images/men/89.jpg", + "Position": "up", + "Name": "Franklin Byrd", + "AthleteNumber": 49498, + "NetWorth": 106, + "TopSpeed": 5.3, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/tw.png", + "CountryName": "Taiwan, Province of China" +}, { + "Id": 167, + "Avatar": "assets/images/women/62.jpg", + "Position": "current", + "Name": "Pippa Morris", + "AthleteNumber": 44421, + "NetWorth": 101, + "TopSpeed": 5.5, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/tj.png", + "CountryName": "Tajikistan" +}, { + "Id": 43, + "Avatar": "assets/images/women/94.jpg", + "Position": "up", + "Name": "Emma Turner", + "AthleteNumber": 39487, + "NetWorth": 110, + "TopSpeed": 5.7, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/tz.png", + "CountryName": "Tanzania, United Republic of" +}, { + "Id": 76, + "Avatar": "assets/images/women/1.jpg", + "Position": "current", + "Name": "Encarnacion Martin", + "AthleteNumber": 40912, + "NetWorth": 105, + "TopSpeed": 5.5, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/th.png", + "CountryName": "Thailand" +}, { + "Id": 93, + "Avatar": "assets/images/women/21.jpg", + "Position": "up", + "Name": "Sara Hannula", + "AthleteNumber": 22025, + "NetWorth": 102, + "TopSpeed": 4.2, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/tl.png", + "CountryName": "Timor-Leste" +}, { + "Id": 147, + "Avatar": "assets/images/men/8.jpg", + "Position": "down", + "Name": "میلاد یاسمی", + "AthleteNumber": 44023, + "NetWorth": 104, + "TopSpeed": 5.2, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/tg.png", + "CountryName": "Togo" +}, { + "Id": 131, + "Avatar": "assets/images/women/61.jpg", + "Position": "down", + "Name": "Veronika Huber", + "AthleteNumber": 18146, + "NetWorth": 103, + "TopSpeed": 5.2, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/to.png", + "CountryName": "Tonga" +}, { + "Id": 122, + "Avatar": "assets/images/women/71.jpg", + "Position": "down", + "Name": "Natalie Conrad", + "AthleteNumber": 42602, + "NetWorth": 108, + "TopSpeed": 6, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/tt.png", + "CountryName": "Trinidad and Tobago" +}, { + "Id": 113, + "Avatar": "assets/images/women/36.jpg", + "Position": "current", + "Name": "Marialba Nascimento", + "AthleteNumber": 47061, + "NetWorth": 108, + "TopSpeed": 5.2, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/tn.png", + "CountryName": "Tunisia" +}, { + "Id": 135, + "Avatar": "assets/images/men/84.jpg", + "Position": "down", + "Name": "Darryl Douglas", + "AthleteNumber": 35826, + "NetWorth": 96, + "TopSpeed": 4.6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/tr.png", + "CountryName": "Turkey" +}, { + "Id": 130, + "Avatar": "assets/images/men/94.jpg", + "Position": "up", + "Name": "Adem Özdoğan", + "AthleteNumber": 45143, + "NetWorth": 90, + "TopSpeed": 5.5, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/tm.png", + "CountryName": "Turkmenistan" +}, { + "Id": 14, + "Avatar": "assets/images/women/84.jpg", + "Position": "up", + "Name": "Ömür Denkel", + "AthleteNumber": 31061, + "NetWorth": 104, + "TopSpeed": 4.5, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/tv.png", + "CountryName": "Tuvalu" +}, { + "Id": 43, + "Avatar": "assets/images/women/77.jpg", + "Position": "down", + "Name": "Cathalijne Van Der Ree", + "AthleteNumber": 45160, + "NetWorth": 102, + "TopSpeed": 5.4, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/ug.png", + "CountryName": "Uganda" +}, { + "Id": 164, + "Avatar": "assets/images/women/51.jpg", + "Position": "current", + "Name": "Ethel Stephens", + "AthleteNumber": 18692, + "NetWorth": 94, + "TopSpeed": 4.1, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ua.png", + "CountryName": "Ukraine" +}, { + "Id": 167, + "Avatar": "assets/images/men/67.jpg", + "Position": "down", + "Name": "Aatu Ranta", + "AthleteNumber": 38049, + "NetWorth": 94, + "TopSpeed": 5.1, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/ae.png", + "CountryName": "United Arab Emirates" +}, { + "Id": 169, + "Avatar": "assets/images/men/44.jpg", + "Position": "up", + "Name": "Aziz Santos", + "AthleteNumber": 38947, + "NetWorth": 98, + "TopSpeed": 4, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/gb.png", + "CountryName": "United Kingdom" +}, { + "Id": 170, + "Avatar": "assets/images/men/60.jpg", + "Position": "up", + "Name": "Fernando Gimenez", + "AthleteNumber": 31290, + "NetWorth": 102, + "TopSpeed": 5.1, + "TrackProgress": 3, + "CountryFlag": "assets/images/flags/uz.png", + "CountryName": "Uruguay" +}, { + "Id": 124, + "Avatar": "assets/images/men/98.jpg", + "Position": "down", + "Name": "Mathieu Mathieu", + "AthleteNumber": 10555, + "NetWorth": 101, + "TopSpeed": 5.2, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/uz.png", + "CountryName": "Uzbekistan" +}, { + "Id": 193, + "Avatar": "assets/images/women/9.jpg", + "Position": "down", + "Name": "Juanita Franklin", + "AthleteNumber": 13907, + "NetWorth": 91, + "TopSpeed": 6, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/vu.png", + "CountryName": "Vanuatu" +}, { + "Id": 25, + "Avatar": "assets/images/men/42.jpg", + "Position": "up", + "Name": "Stanley Hart", + "AthleteNumber": 14150, + "NetWorth": 91, + "TopSpeed": 4.5, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/ve.png", + "CountryName": "Venezuela" +}, { + "Id": 131, + "Avatar": "assets/images/women/61.jpg", + "Position": "current", + "Name": "Eliza Bishop", + "AthleteNumber": 31774, + "NetWorth": 96, + "TopSpeed": 4.7, + "TrackProgress": 4, + "CountryFlag": "assets/images/flags/eh.png", + "CountryName": "Western Sahara" +}, { + "Id": 34, + "Avatar": "assets/images/women/19.jpg", + "Position": "down", + "Name": "Linda Schäfer", + "AthleteNumber": 43074, + "NetWorth": 107, + "TopSpeed": 5.1, + "TrackProgress": 2, + "CountryFlag": "assets/images/flags/ye.png", + "CountryName": "Yemen" +}]; diff --git a/projects/igniteui-angular-performance/src/app/grid/grid.component.html b/projects/igniteui-angular-performance/src/app/grid/grid.component.html new file mode 100644 index 00000000000..3fd9836d7e4 --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/grid/grid.component.html @@ -0,0 +1,20 @@ +
+ + @for (col of columns; track col) { + + + } + +
diff --git a/projects/igniteui-angular-performance/src/app/grid/grid.component.scss b/projects/igniteui-angular-performance/src/app/grid/grid.component.scss new file mode 100644 index 00000000000..bc86bb4c9a3 --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/grid/grid.component.scss @@ -0,0 +1,10 @@ +:host { + display: flex; + flex-direction: column; + height: 100%; +} + +.grid-wrapper { + height: 100%; + width: 100%; +} diff --git a/projects/igniteui-angular-performance/src/app/grid/grid.component.ts b/projects/igniteui-angular-performance/src/app/grid/grid.component.ts new file mode 100644 index 00000000000..7a8262d35cb --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/grid/grid.component.ts @@ -0,0 +1,37 @@ +import { Component, inject } from '@angular/core'; +import { GridColumnDataType, IGX_GRID_DIRECTIVES } from "igniteui-angular" +import { DataService } from '../services/data.service'; +import { ActivatedRoute } from '@angular/router'; + +@Component({ + selector: 'app-grid', + imports: [IGX_GRID_DIRECTIVES], + templateUrl: './grid.component.html', + styleUrl: './grid.component.scss' +}) +export class GridComponent { + protected columns: any[] = [] + protected data: any[] = []; + protected performanceDataList: PerformanceEntryList = []; + private dataService = inject(DataService); + private activatedRoute = inject(ActivatedRoute); + + + constructor() { + this.data = this.dataService.generateData(this.activatedRoute.snapshot.data.rows) + this.columns = [ + { field: "Id", dataType: GridColumnDataType.Number, sortable: true, width: 'auto' }, + { field: "Name", dataType: GridColumnDataType.String, sortable: true, width: 'auto' }, + { field: "AthleteNumber", dataType: GridColumnDataType.Number, sortable: true, width: 'auto' }, + { field: "Registered", dataType: GridColumnDataType.DateTime, sortable: true, width: 'auto' }, + { field: "CountryName", dataType: GridColumnDataType.String, sortable: true, width: 'auto' }, + { field: "FirstAppearance", dataType: GridColumnDataType.Time, sortable: true, width: 'auto' }, + { field: "CareerStart", dataType: GridColumnDataType.Date, sortable: true, width: 'auto' }, + { field: "Active", dataType: GridColumnDataType.Boolean, sortable: true, width: 'auto' }, + { field: "NetWorth", dataType: GridColumnDataType.Currency, sortable: true, width: 'auto' }, + { field: "CountryFlag", dataType: GridColumnDataType.Image, sortable: true, width: 'auto' }, + { field: "SuccessRate", dataType: GridColumnDataType.Percent, sortable: true, width: 'auto' }, + { field: "Position", dataType: GridColumnDataType.String, sortable: true, width: 'auto' }, + ]; + } +} diff --git a/projects/igniteui-angular-performance/src/app/lib/mulberry.ts b/projects/igniteui-angular-performance/src/app/lib/mulberry.ts new file mode 100644 index 00000000000..716a6266205 --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/lib/mulberry.ts @@ -0,0 +1,16 @@ +export class Mulberry32 { + private seed: number; + + constructor(s: number) { + this.seed = s; + } + + public random(): number { + /* eslint-disable */ + this.seed |= 0; this.seed = this.seed + 0x6D2B79F5 | 0; + let t = Math.imul(this.seed ^ this.seed >>> 15, 1 | this.seed); + t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t; + return ((t ^ t >>> 14) >>> 0) / 4294967296; + /* eslint-enable */ + } +} diff --git a/projects/igniteui-angular-performance/src/app/services/data.service.ts b/projects/igniteui-angular-performance/src/app/services/data.service.ts new file mode 100644 index 00000000000..696f477df74 --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/services/data.service.ts @@ -0,0 +1,77 @@ +import { Injectable } from '@angular/core'; +import { Mulberry32 } from '../lib/mulberry'; +import { DATA as athletesData } from "../data/athletesData" + + +@Injectable({ + providedIn: 'root' +}) +export class DataService { + constructor() { } + public generateData(rows: number): any[] { + const rnd = new Mulberry32(1234); + const data = this.generateAthletesData(rnd, rows); + return data; + } + + private generateAthletesData(rnd: Mulberry32, rows: number): any[] { + const currData = []; + for (let i = 0; i < rows; i++) { + const rand = Math.floor(rnd.random() * Math.floor(athletesData.length)); + const dataObj = Object.assign({}, athletesData[rand]); + dataObj["Registered"] = this.formatDateTime(this.randomizeDateTime(rnd)); + dataObj["FirstAppearance"] = this.formatDateTime(this.randomizeDateTime(rnd)); + dataObj["CareerStart"] = this.formatDateTime(this.randomizeDateTime(rnd)); + dataObj["Active"] = this.randomizeBoolean(rnd); + dataObj["SuccessRate"] = this.randomizePercentage(rnd); + currData.push(dataObj); + } + return currData; + } + + private randomizeDateTime(rnd: Mulberry32): Date { + const now = new Date(); + + // Generate a random date in the current year up to the current month/day + const year = now.getFullYear(); + const month = this.generateRandomNumber(rnd, 0, now.getMonth()); // 0 to current month + const daysInMonth = new Date(year, month + 1, 0).getDate(); + const day = this.generateRandomNumber(rnd, 1, daysInMonth); // 1 to last day of month + + // Generate random time + const hours = this.generateRandomNumber(rnd, 0, 23); + const minutes = this.generateRandomNumber(rnd, 0, 59); + const seconds = this.generateRandomNumber(rnd, 0, 59); + + const date = new Date(year, month, day, hours, minutes, seconds); + return date; + } + + private randomizeBoolean(rnd: Mulberry32): boolean { + const number = this.generateRandomNumber(rnd, 0, 10); + return number >= 5; + } + + private randomizePercentage(rnd: Mulberry32): number { + const value = rnd.random(); // returns value in [0, 1) + return Math.floor(value * 1000) / 1000; + } + + private formatDateTime(date: Date) { + // Format: MM/DD/YYYY HH:mm:ss + const formatted = `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()} ` + + `${this.pad(date.getHours())}:${this.pad(date.getMinutes())}:${this.pad(date.getSeconds())}`; + return formatted; + } + + // Helper for leading zeros + private pad(num: number): string { + return num.toString().padStart(2, '0'); + } + + private generateRandomNumber(rnd, min, max) { + return Math.floor(rnd.random() * (max - min + 1)) + min; + } + + +} diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ad.png b/projects/igniteui-angular-performance/src/assets/images/flags/ad.png new file mode 100644 index 0000000000000000000000000000000000000000..c58bc93783885768bebe64cf32d46519c941317c GIT binary patch literal 449 zcmV;y0Y3hTP))g2737H`ql;xKb|J;G zMWSUGDkv0E7=%O=)gmbPJM;o>j0 zo=ZLY8Y;w|N{EP{4GE=N4+LC z+-nNBjdHk_P#e?u|ai~Y%qeZydWx=z|g;gj1MJ+QTxCtI&M+|($ r)BKTwyVVHna1pjwW`1u5{X6srbnq{Kj5O+Q00000NkvXXu0mjfO^Cbz literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ae.png b/projects/igniteui-angular-performance/src/assets/images/flags/ae.png new file mode 100644 index 0000000000000000000000000000000000000000..088ef8ea6df26d9a63d33f5fff97b285744f026e GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<lS<=T9ySL&E7w5zSY?FKF_Gfs^CiFVm_Hud_5w`GIx&lT>O17ZZcR@ c`AQ?hqBvi3=S^uRfu=Hey85}Sb4q9e0BdnC5dZ)H literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/af.png b/projects/igniteui-angular-performance/src/assets/images/flags/af.png new file mode 100644 index 0000000000000000000000000000000000000000..995b351ec62da856161f47a5aab6ba4ab8dbccbd GIT binary patch literal 342 zcmV-c0jd6pP)6~>q90$=P{e9}XgBBKuoG8~BIIvOT@YjXC530@a^-Ea1!9f^_I7tRTkqBI&$ z`fA*oUwby#;)=ijm4JZLfoAvSRi6par$*vqV%YD@cz5~ids8Rg?eDoWd*VJ<>Sh^D o&Et-CC!HOSsHu&XAtT9X005aka@_@&e*gdg07*qoM6N<$f?*t*nE(I) literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ag.png b/projects/igniteui-angular-performance/src/assets/images/flags/ag.png new file mode 100644 index 0000000000000000000000000000000000000000..5f8b4f68b1ba3729a2cbc5019817809402e1e1b8 GIT binary patch literal 486 zcmV@P)fAx00II42mt{IZom!<0TB)X9T)-~7y}{$1|njtCMqo{A_OWU1T7^5E+qspGc86s z21hyuM>_^cI|fKQ2TVW*O+N=t1`bY5ie^*^W>pDkR|#)pCU0aVeP|1T3mAblVviar zmVqFqi4LZU53CL#tRX5`r)kMbX$B_TC!`ihAsd70dsBlQ6jw5Ihf=xmgdJ)!F}z%OIDvbThn*Y`K=zV>14UR+;0_%U?OI{X=DOV9AK$cwOGk*Baf cL)YE+2di#O&P3aI>i_@%07*qoM6N<$f?~AEWdHyG literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/al.png b/projects/igniteui-angular-performance/src/assets/images/flags/al.png new file mode 100644 index 0000000000000000000000000000000000000000..2e516ec39f2d272c5ddfd06c47e53e2e2a593a82 GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^GC(ZC!3-owUoWlaX{Bh^K@|x(Kx^LqB&Eufq=_JRgV-GG0Sd^ zclEa7Q@Gc?$&CNbzD~b+{)57}>yv`0t%<#%JG|?$P1;`LAnA{SV={%q!AE9)HQWFbC*D22WQ%mvv4FO#mim BZG8X$ literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/am.png b/projects/igniteui-angular-performance/src/assets/images/flags/am.png new file mode 100644 index 0000000000000000000000000000000000000000..d529a99e86fb2ff9ec2dd53c559839f77b8904d0 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<)#zwDO)T0k|UuNtU4tC0mFAmggB z%GZP9x7-w|WAu3u)eq|>fe6R|a-USnepn+(9iwk~Dc-PF2BLF9AnrAD7{+wuhAP1alsKs(-y^xqN69eU-F`xUFVdQ&MBb@03s$d@&Et; literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/at.png b/projects/igniteui-angular-performance/src/assets/images/flags/at.png new file mode 100644 index 0000000000000000000000000000000000000000..993b903af132d9bea67a3992f3a286ad728d026d GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&QaYY4jv*e$llLedKjk2Oz#{9* z27_OjekN;s{{8>|f5pYcZu~xvq|d%s?Dm+Ip=h0={K2B<=YaYcJYD@<);T3K0RW{2 BBKH6Q literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/au.png b/projects/igniteui-angular-performance/src/assets/images/flags/au.png new file mode 100644 index 0000000000000000000000000000000000000000..ef20b66dc8e216dc17c1107471f6a751c7cb763d GIT binary patch literal 501 zcmV|G>ci!ovT@8@$$Wi?iPS25A&#`jZFTVL0pk!MEKY%)Cq*xWKwy77v_rcm8># ztq`l}8xJ9poz1dwC~g2EwHh=+1&@3Pu_fBPyYlpz)iDv1?{RIPNIna!RALA{e?6)p zhapn{sl_6NQ1K~w9YUt3u-B8Ju2u_rs#T~g3pxtJ@pxE(h7r*S8k!!F*Ho6QQejY; ro@YXlUM|y6mGk*B6p3~_fq(M{=}IIyShGrS00000NkvXXu0mjf7bfPE literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/az.png b/projects/igniteui-angular-performance/src/assets/images/flags/az.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb7ccb30d9f85428f1144ccc6573fbb3bd8e0af GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<FKUskzAG(gtF*%a=({Rb3r4E**1@DKe9j1nP2UI$K}tk zE#2Ml_t6*s|Nlo~Q_TPX0BT7@K~#9!h0jR}fG`jR(KydjqW8b50l`9C)ZaBc8Y(>7 z_t4hy{A~;06=gLaQxg^Dt=AgzPlsbS_B|5#-;mOfr9g@dQe==KgA^I0$RI@qDKbcr rLW+P=1hgWc6#=aXXhlFNTHf;p$FCF7ixnrG00000NkvXXu0mjfVo6>d literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/bb.png b/projects/igniteui-angular-performance/src/assets/images/flags/bb.png new file mode 100644 index 0000000000000000000000000000000000000000..5e87a9ea9d5d4e6fdad72430454ea6bf7fd6c938 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&QoB4|978;gCnp4~KHmIKKKyX= zhu5hRrd0+~wPlSq0)b~=Y`2~&zb3pz;z`OORu=)Y009lxi5LI(t(=)r^yO){-JJy~ z>&`N|IIvCN7Gd!Ulu~$YwIt_@Wn<5;ltcw4qlTCT3ZjRkURae{Zi{aZRdi#PbkGZ! zV0BR<<9u<|JeeaI3d|>#Msa2Oh?bc=yEGx4SqUUC>*Dok+B%sNI=(-G2o&vVb65Vl l`OK3fLj@^aXSW#_8SIvY3QC?eegX6agQu&X%Q~loCIDFYTBHB~ literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/bd.png b/projects/igniteui-angular-performance/src/assets/images/flags/bd.png new file mode 100644 index 0000000000000000000000000000000000000000..c55d3d7ac086527ff9e3175e11d88dd8bc597551 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^ia;#F!2~3G3=gXTseVrv#}JR>$q6SuEw+^MEPHX} zw+c(em)*Net9G!rRdp`^5p-7saR%?UWhPEcBJsO)18(fp#&+1Te{y^tMA?u<)HXOGYT~2k{J-Kao{$Q_!b(6CV z`*ztc9NJY!ENw68&HbccdrHV^YUkoo5g{gqpeIJjM;(>V0G-C*>FVdQ&MBb@04b49 A{Qv*} literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/be.png b/projects/igniteui-angular-performance/src/assets/images/flags/be.png new file mode 100644 index 0000000000000000000000000000000000000000..449446af9a7ba2ef7e838043bab0e623bdbe626c GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6I!3HGL_ATQBQpTPxjv*e$lM@mWe)MyTs~OAu zuJ3zopr E07|hW8~^|S literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/bf.png b/projects/igniteui-angular-performance/src/assets/images/flags/bf.png new file mode 100644 index 0000000000000000000000000000000000000000..f3a728811c98241db5fe84b67641b314354f3cd1 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&QZ=3~jv*e$lPlJ*^;SM&koCpG zI4YjKB_r|6^pdOVU#=*=*fTE zo5HMN&7E}b*6WzF^ln=U?C g5V+XA_gFW>HIEq=7am-`59kgCPgg&ebxsLQ04&EyPXGV_ literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/bg.png b/projects/igniteui-angular-performance/src/assets/images/flags/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..ec03d4f8dba275efbac13197cb20318523d9c42f GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^ia;#F!3HFmgF^~|l!K>>V~EG`{q3g0 Tr&^joW-)lW`njxgN@xNAH|isi literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/bh.png b/projects/igniteui-angular-performance/src/assets/images/flags/bh.png new file mode 100644 index 0000000000000000000000000000000000000000..61bad9b4129df9096c6ae9d1442806ceab47ea7f GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^ia;#F!VDxo)_OVtDd_;85Z7~pYUhO1FKgP|2~K*} zKJoqLT|b{Z`}h0L|NsBr3KgpWmC1U#IEF}EPJY4AB*Mz3!XWfg!&F71X=U~mnK`={ YxP~0002PP)t-s9<@3m zwml=aKPI?AH@#3gzEfPuaAM1Kgx8dd*_xoMgrTQ^qNstQtAnGegrlp3sI-r%w2rLE zpsvZFugasa%A>UAy}Rke#~CNe6(-9RCCd~h%n~Ke5hl(OC(aWn(IPd}FhbWpPuN3L z*+^K~^WNU{;^A$2;&g!G@#5n3=Hz{e>X@PG`0eYUsO+Mu?yt7-`t$V4&h-5D_0QDz z{P_6&`uY9)`|R%f{rmg={QU6o{`&j={QUm^{{Q{`|Ns9*Qar%`007QOL_t(2&xMl5 z4#GeTL`@C7cUVF%fzVs1@BhDw0|HSN?Ynv;duA+f8re#ZJvxE(flXH{=x%_%_#$h# z&00V6*6arBh)+aF;nWM=FIJzKgjrncN;lL-Um>W{{R30 M07*qoM6N<$f@@s!T>t<8 literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/bj.png b/projects/igniteui-angular-performance/src/assets/images/flags/bj.png new file mode 100644 index 0000000000000000000000000000000000000000..220c8e786c755f2aa8e9227b3fe43991d585f8d9 GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&Qrey_jv*e$lM^!dRXYB~h$u4~ y_DI=geOYla#Qaz50zJu$D=z{UyZ5SbGBUKTdh>anTU{Ga8-u5-pUXO@geCy1upL_f literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/bn.png b/projects/igniteui-angular-performance/src/assets/images/flags/bn.png new file mode 100644 index 0000000000000000000000000000000000000000..944a7be1967f862030e0e287d24b06da626425a0 GIT binary patch literal 847 zcmV-V1F-ywP)6sNmnf-*^9fS@Y{{ z&CloF-yh0j>U?`q?A=xBTZ{&N|NVLS&*w$I-W2_K=J@@A6j0~!xndhK#ok<|t;J}; z@$K)AlPgOCXSis+yJ+4+IM`}s{NG>2Ry=dshI9kH9O!Qda$PX z#EP{@iS*f@uUmh=Z~6HmT!b8nqKv(ztq zp{xHY_n-~F5%ZmW7J7%=zjh5M1ypcm%Qo~x`s>c0FROpOt@`=g>-$4FqAW%RPOLmx z{32og%9Gs8)=#ed^7+;Bq|7zBB|x)p?AdprbKc>`{dwunr-i@X z6fn%_;!BC*G|*vXWx;2$03-8sUKuYozHUJY6=pVOW`;~5kuoLOsr~VrdTS1Q2c2r` z+oEOp_TB>`lL!Oc@9%Gl9b7Ne+rS$c$f2gh!pMkjcRr^`IJ-cfrdT?UFpyisC7R7C z0%YX!iZsiM=F5ps)>fTAEBorD?ZhNf23(Q<;ecAY; zCHZbSDkgIX<#UPTaEhey30*f;3Kr)DN&yu>oXE$+WN$56l4rAWNyYs;$4Rpo4Lvw5 z+G8(LV$JVn!QL+}dBa5cy0P*NbER9hO0@!FYz&N+tXzI{xbl82pTFPkZ!*HPJ}FSo=%W@DyUcNTwg6sMjR3kwTz_LE)8-`XK|Z=V>Z_`4fo z2i6I7*YQRKaHuFUGcr=!Vj|ItOJZA>2sW1T_`0!6iZjvAVl;H`r0A;I0%h6U3 literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/br.png b/projects/igniteui-angular-performance/src/assets/images/flags/br.png new file mode 100644 index 0000000000000000000000000000000000000000..b54f27df8decc7a8424c0895e8050a5640858622 GIT binary patch literal 436 zcmV;l0ZaagP)rUoRbX|B&gojd#3e;j52l0Y^U%$1yOxni>j&_rYe6ak8pX)e=b z`;6tPuMRN3-^1FSX%%c0VJx2sB!O(82v8g-3sggzxw^AW4)5RtI_>64K_~4*4Y7P= z1QY>^17(3~fGUYHmvf43%Np4)hZup{z8+)@wFw7rh;dpw5$Kq}KCoS4CXYF$SK#T?kcd%>EnHBDY z!vRmc0nN46ss*h%030000UjtV5aJY$gi*dc<4Wlavx zK~ElUz6*Dg3?7IG8m#x?yKQWo^Iqqb5?fM3tKk2Qy=wdAECK}$1vn)nB_BDd$j{xj zaQjh#1BcJv30n8(=d{Bd8!8f-su+Z>JESac)O285a6+cRD~Vy%(Z);;o`B2j47C&f Vmy}POa0=*N22WQ%mvv4FO#r8%QWyXL literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/bt.png b/projects/igniteui-angular-performance/src/assets/images/flags/bt.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd0d6af28c4a04fbcfb79f20d679d139bec4569 GIT binary patch literal 685 zcmV;e0#f~nP)$1#v8yMz8L6pVyx^v8#IBin-gitXnX5`rK))$CqaIb*Lyxoiw2*J3D*n(xp3g>{z{U`syW%w}yJ$wncF=$*w*+*KOL=$^HHP zC3%T!md#!;si!U`q9`F%0a7k|N1@2;)p z4qu0f;r@-qh5e<45JRt8sgYy!gOx@z`>GZ!STH#yZf<$eL1$y2hE48PJy~fDdD)8+ zBKFjjOv_HYO}x=JmRUSoqx)>N_T-A#>f*u)Els^8h3k9TH&hft^Z?xpv}Q`U|Dh!d z&TLwLBEpkcqnEYWch%>0v^JMzWv-42m|k76FeYS|qv1_QJ!GACY&92WCGT3c$Ok}%LqaNXoF~UY4on*eFIr|*ggYc+d zUthVtzq=>E^NzJTnMT9QSu}Jg*mY%p&pBs9a$Jp8&SIi_HtM9B3o;s)V<|@fN28z& TsNVK<00000NkvXXu0mjf9eGZd literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/bw.png b/projects/igniteui-angular-performance/src/assets/images/flags/bw.png new file mode 100644 index 0000000000000000000000000000000000000000..0a74b72f94318af68bc14f823e1528b7b1db999d GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&QU;zbjv*e$lQm*XXS;PIUU?C? z_@ngR*RP_b6x#}BF}5w_%#ctp={a^$$2jYYgCs9Q{x^Yzx)Hn7fO;7`UHx3vIVCg! E0F4|USpWb4 literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/by.png b/projects/igniteui-angular-performance/src/assets/images/flags/by.png new file mode 100644 index 0000000000000000000000000000000000000000..1c9f5462a6112674d8be810828cefacbb95412b4 GIT binary patch literal 307 zcmV-30nGl1P)G*Tn+9C}PVPnPSh)22r<*M3!-$&FBH|rinyR5cm68 zC+Pv-j)Oz1h2wCDbTXj_ye^kWRTcYM4Y4HA1HNnad*ULst@C_OUoI(MvAi%3s z=mBrK4zFB>TPkHmvx8BmgP_qsG9J?dJ}e8nY88IHo^A6Vn0LhgCCPneMys}0l-Qa| zafe#8M6f9%Qomo_U_cDWhXrClK5h{M@`05ckc<4(fM2RH(|%g9Chq_M002ovPDHLk FV1mYifxQ3# literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/bz.png b/projects/igniteui-angular-performance/src/assets/images/flags/bz.png new file mode 100644 index 0000000000000000000000000000000000000000..ef37f6da9cd2219f5a44739836e6b9ace1622e8f GIT binary patch literal 751 zcmV+(R>N zKf2PertI^#Pe29a7!7pP*+*yQZJY4^!~4uBu~v<0u7$>KC5FcN(%G{T-+Xvex-{$W zpFjBAjw^g`KYKZIXW#$-|NAQot=0JRs+07BWW76#gF+RpwH52iieG+u*|M(c$?H!z z!yT(AFrwC;T7Kl}zLE&PZcmk|3EFYH}M#)#km6CY*qa1)KGwUuXX9N&3-4Nx%& zMg!B?!u`|Ve}4}QkcoX=JsnNO@gWnMTKj84>ht}2I-9%Nn}JeqzrC$rR|Zr}g3-YA zJAGIGgZB@B`q!^tzjW!+_NuDhwuTimBD!*v7cX866a-4$dw1{P$<08;qy@}R3Yj>XCwB_=; zjP{85N>{g1U*oJClZ?E8nuMS%`yUAcG!m_|uUe2^^j?BlbYhgR-8x3{FGr@f+*8a1n)^0zt z_W07}`)A*Hb%V@|4tM*5m+wy9JHGtjysgJq^>1r`aP#t}OY4EbMN#pDT&VV}II;T- hiG?Z+s{-0pU;xn7$n^n-vZ4S0002ovPDHLkV1ic^gB}0? literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ca.png b/projects/igniteui-angular-performance/src/assets/images/flags/ca.png new file mode 100644 index 0000000000000000000000000000000000000000..524f815786ea0f9e10accfd936a21a66223a2f7a GIT binary patch literal 302 zcmV+}0nz@6P)NklG*;F*L4sI?+``5qcoL6bCs+h+Y%Hujg9nICo}`G7!~}F*8D##< z!_O|WtcDn~vEZ5i@&e<&Cv+Gm39-5H{Vw}GL9(Io^(sN|1W1ru8DB0_2C3fob{hvO zj;9QgA}s~RT_?w*M3L-v5{8ndQwB+q762IVsw;NgSJCr$f0STrZ?*3ue+Jm9#!Vxp z`HwLe@Tw~=3bCwt7ywMcRJW}-&Nq@4fU@Jn#M<^dMv<1vb36=kIETt+h3-vp24>KCrApv8Yb7 zo>H`%RJ597w~l4FjcmDwa=U_ayMckec7(okjKFP_!e^z$TCK-Zwa87k$xFe@L&M8L z#mhj>5FySHA69Dmz#r_P8tu3o?yej5)*1KK7zsc1>;M1&!AV3xRCwBTk69amKo~}C zkqAkWM3!l>w5YV2|Npb(%l2gETz&JNn>h_S+`4e#m^J?;tL2`7;M|Ssva6<76QNR1 z&zT>|C{bV`1iG`r7#{~;*_Qm!2I*wa_a5W%M>fTCd;)n%4njHfZqj!7w!$H~ zfIP)#5q>=EH(Jw5@_Ocgv_oHN6GA~+L8LIm&=T{Ss$EJbGQ3=4VIqaP#hQbO9IErx tMh^ujp>^n?05!DY6H4Y4N&`ZvJOE-=BCIOaGR^=1002ovPDHLkV1hmf(yjmi literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/cf.png b/projects/igniteui-angular-performance/src/assets/images/flags/cf.png new file mode 100644 index 0000000000000000000000000000000000000000..e203020e75b7b3a4f9cdeda40a81af17e339f4df GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&Qazq7jv*e$lM@Uwnw0ZCODQ;s zH7@XJec{cdR>1NkY1P4|36_eQ4;@@m7fbR=cb~G|H$R0@NrCyq(q*eHeO~M33b89G zG@oKr%8EXhAIa+Cz*gGx&!45@qMh)~429_uv5VamdKI;Vst0D4%h|8zrEWm8XkiNX4z#la9O%1`G!dJWS;BV-h>Ce_5`)$F2C{$FHl(&;S4YM^+3S aY-3Q%SDUHk`D8oL6b4UMKbLh*2~7Yj<132* literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ch.png b/projects/igniteui-angular-performance/src/assets/images/flags/ch.png new file mode 100644 index 0000000000000000000000000000000000000000..bd447d2bc37ffddeb296bd91684eed6da78ca644 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjyBTpB{5R22vI~0$5nI%co%(Bmo zVs%%^{@2gawl*!{z#nxch4%XsuGwaL4ey%p5uQ*FimdKI;Vst E0D;UNIRF3v literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ci.png b/projects/igniteui-angular-performance/src/assets/images/flags/ci.png new file mode 100644 index 0000000000000000000000000000000000000000..14fceff96de7ec16475e3231d8c8e59c9730e0ab GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&QW~Bvjv*e$lmEn>Z(uJl`Ey+P tw1vIk{5LBuE_Umevd#JeV(_~zW-OKUe>+){a8_yDcFNCE_SWRVf+tbk9*U4B!w7#J5TECljznfQn!DZ5j zCE>v!-}GAlaJEOrE}m)p@z>y8H5x`SG&zARBx+c1r}5i}A4B8BWVjVj8T_pXA_c+# zaJ&?9J~YQ$Ub--xC8w~uE6welE5(&XXPSELW+6Z?xwLNKVe`+Jlgj-tKLKF-FXdtVFm0k;!&YntF zuWo^Jlfa|dX<_3S`xd@+tFcW3AD9OFu9dLmUHlHus@vLC>E_LxT)Uh;(Gw()xfIpb zGM8)+mCp-QtQD7^INN0EAk(stXbF;Gz+EdoH80?Bu(%vSklzb?&R05lyms~MvUK^u zz_QWUu6c&fU4eTG&l0N8ZZ(|N!n0~LvPHbf+`Y@f@wJPPIXZVadaH$vw&Egjvi6^T zp^=fK8A0R4xLrVH42vM0O>G@LAb<&|h09LWqi&MKlSfY6L?!#5zd%)4!;QWtT@9nH z(dc~-A2a-VyKoE7Dle7Pcc<*Vl9zWe|46l})Dz=rtVrKpIyXS!9jF+FeGz$ooiN}c z=oP4#8>j${#)`>0MJ0^+A%plu^1Ablo$TysmMO1ZAGdhLfurBwM`xkGiq15z5?40g z>tZ*qqWel0Ma=bouM=+kn&kuc)6~_+5Z6PN2^ZE?zg>(7F90^4qCE9 zV|G62s}4b?l7gb@Zbxqb22H@I#A3L~BtC5at)}))R;YONMXauQ9PvbamvmFltPz;2 zDTyBvMhXN|VHV#d16$$2LSx2l={xn!hmDkq2sV8B%cu{HXILdaq} zZ^bd*tSmB)*5aayPv1cgOcZ7j7xh75E_#B;PSB25G->N?=BA|*XPZt_-;JYS;Kd+< zjs*s$@XrvzQwgUhGs%dtqTu9;=(O`>9IG)YUdVBa)DiTW|I%HvVjb*Z%Uyl2VT;DYc|L|j@Fk{0vl4%?O11^F{ z&03k~=9djJmV5+Z_2KY%(%#h1Sl^pJbMdoTN0q|xSySlcm%TK!SQ7;>SMxubu=-_;Gf|ks z;{DQnRSv%U>=%74-Cs3*Nj8F{6A8kA*WwVw2CqDNnDnABZ+IWTfQ#TDOnikv|6{^I ihA~y!FyIdM>GKz@?IEI4muMmY0000np41|Eg!v)1if zv+UFJCJ6yX$q>E??1fzZpP$ZqcA8l-#O&9e63u=TH~M87_wSQT z|L-yY5s>jRog1#=LpS@|8cvE_{VbH{|2>e=Kn9hg@k1Z`=UHr@XR-kq$SQ!r{l0~R zBBLKW@}V)Hky*=0X@Fo!eAS%qn>c8buIo6-3kt$U(=a!V8a-b*0PcF6q#xm0 Qp8x;=07*qoM6N<$g1<;u>;M1& literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/co.png b/projects/igniteui-angular-performance/src/assets/images/flags/co.png new file mode 100644 index 0000000000000000000000000000000000000000..477177ba930419633cb49a8c2b7205cba81b9f78 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&Qd*uajv*e$lm8S4_B5I`6kd4| xxY)f{?PLa9_sPX>{I!eEbFS)@vVGFa#&D%yhS|d7r3_FPgQu&X%Q~loCII209eMx& literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/cr.png b/projects/igniteui-angular-performance/src/assets/images/flags/cr.png new file mode 100644 index 0000000000000000000000000000000000000000..62cc81a7023fe7aab22f2ecd3961040a9030e0cf GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^ia;#F!2~3G3=gXTDQiy`#}JR>$tf4sr7ti{kkKn! zbE9tNv$8+`|JO&{_?Y)rY}V~Uzku8;eSy|(DYs{=EMPa?Ibq->%-g;S`E#{ZUbaB!zf3 z%^oVJ>Q~bi0PX$v=kG;%Q>;;bTvR_(K8Bs@7Joi;;z?Eems98OMrF}2sDbF3i3b{k yeu-q^By{Zo)(rGUM0000HY6lAV_y6y2TG{dM_qQJx7yZ1t>i@q#G_d2}pPyG(e_j#z>-Ki4h1J&`1>g2m z{y04yh`ww}dDp`EalZZE4-cskAAf%SethiT_jm6)1l~3cN{=Kw0YeNkl#& zTKgWa#kBN2Q5Ms}_e5JvZQqk@F|~Y8mc@#WW&fwDSpUB+B1JYP+2UZ+*#E~Rlqj;4 zB#WuxOOh?7mM@96nA*N1%3@mh60gOy^d(M$q5pyiyPPuw14Y( xsQ32b3R&d~edlFO+KP)Lt${Qv*|&)@%h?|v!X{(|~OL%`>sf0teSn7x?>Mnk~kkH7klzNLxL z5ODVC_nO_WXks)F{QCQE`>oFfTVGJ$Xb5=!{m=ZfAF^p-Gz8px_p9^J8;XryzyAN9 zKbWTf`~Uy=qi+>EUy^0?zkmNHPW-Q;@;^BE|K-bAo&V$azYW(u+Bh8vX0RmZ4CicfUAfw#%EkhC&bkPWx>o Tyu&>p00000NkvXXu0mjf*m=Zp literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/dk.png b/projects/igniteui-angular-performance/src/assets/images/flags/dk.png new file mode 100644 index 0000000000000000000000000000000000000000..65d6b3551f41329912d32a563a299d16efab8180 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)i!VDx6^9*`{lxToYi0cI&<2#;dkMrAJOP)`_la80=W##A zV?0$-7bpmnBFQKQU~CbO?mMYeC~H4sF?+>gZmz6oCuDJo#rO$}X_mUy6DL)YjAGC* z;UFGe<}~b<(gxZJM14|KEc#+sI8A`;Iik8(IE_d$ih)g%pLleU-Ds|eF2v%A5^22F z^4{92Kz5gu)l8j>bPYQV8pP#O!^_0czE}LCw3)6VkXx>zecwNiB%>IB zxsZ4S%sDUFET&28ZV*wQC@bNm!CfvP+byFD6a-36YPGlD#`#ANF@EX&v02!?$MlB{50RYJ?LCXdk9T@-s002ovPDHLkV1mI~uF?Pi literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/do.png b/projects/igniteui-angular-performance/src/assets/images/flags/do.png new file mode 100644 index 0000000000000000000000000000000000000000..12e017e02092a58e1e34535468f5123edf6a4c4f GIT binary patch literal 258 zcmV+d0sa1oP)ThOv?(At|Eg&+k?qxUp`0?ZS zpWlD}{`vj;cS6-nB2xzgk*N)sE|J{@OtnO&?@20DbVF@Mq(YxBvhE07*qo IM6N<$f=zC4T>t<8 literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/dz.png b/projects/igniteui-angular-performance/src/assets/images/flags/dz.png new file mode 100644 index 0000000000000000000000000000000000000000..4670a0eb85be9d801fe0f327edf323b2ecb8005b GIT binary patch literal 229 zcmV^P)jA z(xsmpHvE`3k5Z$pQ?!8QK4oQcNYaD{$lo__{(buN@B4R(j9#TC05p2BmJo#dYxCy6 zA3l8c^`%09+~i>e8XXa$4B`HmJ^L*)^IH~{?-M5cegB?TM*pMGXc`6x4Wp5UiI28f fX0&)30!9M>h@M8C+%`;800000NkvXXu0mjfbyi<) literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ec.png b/projects/igniteui-angular-performance/src/assets/images/flags/ec.png new file mode 100644 index 0000000000000000000000000000000000000000..9289152375de353b0091adcb42b1b331cca6ea58 GIT binary patch literal 397 zcmV;80doF{P)U2R5Cru4iiQHImCrds-0Ui|vi3ERs8e078yx7zIl3kUClPX1{ z14N3`qT{1n-K_pjIL zwffL7s6U>RsPg78wz6uf%gReJEJ)U`DNB&m6|3@M|9C>2h86=udrdY+w7y?sYx&gq ziyf;rMHcsHYq$ahfl{Pd%wRE@By^&Y)k&qOyg9R?sW2urE+ocZ-yrrx6Dz6akZy4c ztCns>U1Ew=u$QHaS!H~xv_sYL7TR09GLWr1Pt{UW#z0NUKttJHS9E1P@9H2n+FC4W zQxd3Zzs{C(o(+$$on*AH>{5H~)wW#D>TWW&MKrXS%c4olwid)TZj%*tl$P*iFzp3$ rg>341EE-6&_?)2HfS^%}hrh)DI_x=kOL@Vf00000NkvXXu0mjf5TUl* literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ee.png b/projects/igniteui-angular-performance/src/assets/images/flags/ee.png new file mode 100644 index 0000000000000000000000000000000000000000..1067640131ae259f460dbf8e6e2cdd614e027706 GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^@<1%Y!2~3KaTl%yQrey_jv*e$lQ(GDI$0kv$of@a z5_@)gV_8R{NDoucL9QsKw*OmL7BAy>zsxw}>J;XO|3$U|wJ~_Q`njxgN@xNA`R^8`HD$Vu#+E;vtY!Z-NDc)H&|?MJi4H$E2v0ST+XnMG zAg2Mmw(4QJFF|$=>}vd?eNo*00nfqgEJwRwUJvY$7q>sa!3^wJ1@rqHHuzo_H}x<+ z7lcj|bguBqU~UU|JJDfX*G-v9g|sD-{nz*)juJS5mGuR}sZ0BhHBJfu00000fhdEP)92WBXrcUV8o0SCqIOu;?i%>!L~~ZQczII-mRsdpo4$G&7sgjuqcR>6rqby z6htF-h$Vs2}eE~0AG@58QC;4~WWT^IjVQt%HR z5(#|PY7^zGWD+CCfzxavtRR@Cprn_{!1p|i*ITKC=Ufi2hJlW%hUZ{7j7RV(ofeb& zA^1`#z%G}=Njvp=3=t~|>}oYK;xE&LKN!HZtm#JF(KNX2HqB3RwWfX)&$D;>wcd(@ ziGnvX3_F_)>^NS26}*^dSl$&62nrf240HRUNrdr8x3*=2l;GI{!%|jUP-K-sIS?C~ Zd;=R&EwL1|YVH(Wd}|-wQN>E_f|u_Ghie zk7gZW5(JTsK(Y9vtI_Ypny)y_U$L3}p0D|%OZ!K=&T9csAb$=q_`5@$NQ;Sa1d7F< zd<=i~YD3r`?2LX*(fXRM2Mr8k<3H;)-s>5YVK-JspjZsF=HEW`SM27%r1VbB1nBAS zRl0A4K|cPPr}yuW`a2yHN-VxA>a)tMv>|+cSmjAni}UpUtkrxYYWm*L_}^~zZ$-MF zf(+iufYQ|W8XcgIKUf=4Vwq#-T{uFq_^p!3pEa7lW@!QA^`oN^(7XTktG|&j{TyZh zbjQ~mJqj(uX)&<4_~dK&Z>ReAdL3XH0?I6C!;3IrVFJwARJ4pJi)mpQQ5Ms}GMpCE+A1i1< Z0sw5_?>WcKS|I=c002ovPDHLkV1h!%1|9$a literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/es.png b/projects/igniteui-angular-performance/src/assets/images/flags/es.png new file mode 100644 index 0000000000000000000000000000000000000000..a8ad334cab5a305d386cd969092b24cce487437d GIT binary patch literal 287 zcmV+)0pR|LP)zmH za=b#Gy`-DAkb|nIo3Z7-S*z;&9nEsFp)xU{ lvQ$ggRLC-;#nW&w8USm>^83o z+CH=5Ku!IjG9bfj<3^=52Y^yEv{-WWaiISS_c!`)p98esdefSK?Q@FvH;Ak}1C*kz z#jMM&YpvVWdZY+wD-g9EDFkwXg0!_57@l%#4l^#j1&rP7eXW%TYhrgz1ag6bv<+%V z;*wr{G-q#{{F*~R1dM5*U&%>auS%3iLN(o$?8~kKbCLL}6F>xHa4fqD6eQIghDWv< zq@wkqf$lAf#b=!aA|M0ECBqPMET#$?wRrej3;@Ua`%=!QuNVLT002ovPDHLkV1jU3 Bmv;aF literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/fi.png b/projects/igniteui-angular-performance/src/assets/images/flags/fi.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad17975ae03acea7434e52d880e995e779154ac GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^ia;#F!VDxo)_OVtDbWC*5LX7%25!4n36CE2kjd`3 zi^Ho{|NsA=<2}OzpaKm~7sn8Z%gG+hO(|?`8%#7j5*94);1;kjGFY+0p^=$+E5ovr c%&&qOG~Y)4%&s$71JuLd>FVdQ&MBb@0D9IYxBvhE literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/fj.png b/projects/igniteui-angular-performance/src/assets/images/flags/fj.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf737146826a3060a626368e2a578eba6e5a815 GIT binary patch literal 617 zcmV-v0+#)WP)9)D%t8$6krdl_3b#57I-?7p> zpyo~>sDU8~3{Oy~?mZ3+VQ5hQ{tFCwVE6-L0T>tfgZk{eWqYup=tNEB!R9P17DEj^bQ)x3)g+*mxUv&e<*{?Xya%x!)428LH%~f0tNX^X zd%?N)gL4-=*lM#U<@lAuSS$vX1HjS%WDv|s`~?Wq`Xgt7B@d=?XU`mbcV^$ctB3FT zX9Cg3cdu_A-}vd$O)M5uk|i+F0abU*Gzb)=xy5^W`nF7(vbksSCCji|RuS)(ZF;kG z!qw(Jnp-@#f5!F`dyX7AavvPW|37a0|Dtwn?;@I84D$5cHRsNpy&jYewD|MY`R7(I z#a?nz-C`i>nzLztL@^L`&Bk41(!ye*%IZ;zhrPuBBZ439I+)+600000NkvXXu0mjf DO{gO8 literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/fm.png b/projects/igniteui-angular-performance/src/assets/images/flags/fm.png new file mode 100644 index 0000000000000000000000000000000000000000..32d5b832589054c7d96becf39a14ee4afd3710b7 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT)!VDyZ7Y11aDbWC*5ZBU8cWbxZpK|!=lp{}9 zU3m5N*Wd5I{<{AUoB&i{?djqeB5^r6K|xd_k!xd%RRY(tL@q-qZi5NzG7eIbkrP^H x9O7wEDPG0IXqZ#w$q;dOj$4X^#>5<1hS(>pQ`4U=djvFw!PC{xWt~$(69CtdGIam| literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/fr.png b/projects/igniteui-angular-performance/src/assets/images/flags/fr.png new file mode 100644 index 0000000000000000000000000000000000000000..a7684766369759520c38f5d1ef2c77fcf716f5b7 GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&QtF;Ajv*e$lM@1F^t1mx&b=?g r@{uFYVz+)N+pI4uE`k{%y=)Bc@BVdLJ;xyjsD;7P)z4*}Q$iB}YL^_V literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ga.png b/projects/igniteui-angular-performance/src/assets/images/flags/ga.png new file mode 100644 index 0000000000000000000000000000000000000000..32c68bf6a4d807341b575fd4a7fcb31dad0bd0b3 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^(m*W2!3HF2n%o+Il#Qp0V~EG`F RDimlAgQu&X%Q~loCIEuPDtQ0^ literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/gb.png b/projects/igniteui-angular-performance/src/assets/images/flags/gb.png new file mode 100644 index 0000000000000000000000000000000000000000..3b6668e203c032348765d9cd761223bc2a7ae4aa GIT binary patch literal 434 zcmV;j0ZsmiP)}5 zFoX{=g%C1@Sa7Ohc&}o4uYHfbevrL?k-mVEzMibkpRCTGt^Y=Zlu-jF;!S#ORNi=)lS8z{&8|-1EZ7 z^TWyW#>@1_%=O{s_t@O`+1>f>@%iuZ`}Owx`1$|;|0#A0uK)l5;7LS5RCwCO)5#Ko zFc3x2W>5h^4GxGCf&(b}{{QnNX-OHhEO*}ZStOkf#RuRTTGZx3G{L1dYp|M$#hI2u z(a8P`ZBH?Pf?QJ*GTSk$heVE|M|l9-fXwD6$s8h*bf1VRQw?8O#LT3l9>bpBWiHnr z7g@TlfIGu-lWs4-ZPI@NLN|tQk@&Gc!k;gr$1}MBmul20@>I^mOECth8EOSXEJ1>~MuUXX4gQCQ2#ms;vCB+8c czCx(z1B=8y!*9YyNB{r;07*qoM6N<$fxP~0002PP)t-s0D4{l zdtL*3T?Kqx27Fx#eOnWOSr>v>Aca*hi%>C(P&kH7JC039lSxvRMpTzZV4Om1pFfT@ zH<_<8n@2REC^NLUE4D-|w?!C0R-Nzo_o*&_1ALD5s=XxFK z$Q$a09P5i5?wA_xnH%uT8u6kU_`ewX$rt*|7W>W?{LvQw=vM&%0081iL_t(|+KrOu z4uUWgMz4x{;Q+w_ihx>h?}dH;r?Ml^MosYi_-<}{l0t7`8iRaRmMndgtS5$dKe?m? zuYja`x_go_=^2#Kh-QD#7md-IFheWr_&0i4;|4&@#^2aAfY>0^osWH|4j>Flrn$g^ zMKc4k!O5x{jGvb$#v3&YARGBkk@re#JKN8;ErqwjDBxoWINft}?gD%ox!bS-oc1o- zwZ9FhRF(LYwZ9gpq9?LfIWc|9WM$0KwB+e?yz9Xw1w9Z+_i&Y7P)vwu g&R26`ttAdm;e9&2bZj}0je?gba4!kxSXuP-ps^S#?icR&z?0Rr}+KZKYP0@sBteh wxZiP7=8S$=z_C;A;r)4Xt7@k-F_zggTvZPf{66_~G|&hJPgg&ebxsLQ0HY~42><{9 literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/gh.png b/projects/igniteui-angular-performance/src/assets/images/flags/gh.png new file mode 100644 index 0000000000000000000000000000000000000000..c2bf9d0bb44d771dc11d81a32d29d57b9a1627b3 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!3-qVmezg)QZ@lTA+7~8bg$~Ebk zQ5z`CkZsS!!N|kKXr{~RY0DPo&XF0;nG?ymbEd#KLAA^4g`Vycd2>Yc&qXoL;~N$M z)w7la`2`<4cKrB>qCblFfC4_AE{-7;x6bxj3LQ}3VV2E1A-o literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/gm.png b/projects/igniteui-angular-performance/src/assets/images/flags/gm.png new file mode 100644 index 0000000000000000000000000000000000000000..b929a80dec10594cda47d02a8e70b2885cc64815 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!3HE}t?oSnq&z%b978;gC)=p6_%=V0f#LCr zql?8ZpLwKyHTO8%kw<^q<>Mp;x+_zv{`E)M?9u)Aw+aBI89ZJ6T-G@yGywn?lNk>H literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/gq.png b/projects/igniteui-angular-performance/src/assets/images/flags/gq.png new file mode 100644 index 0000000000000000000000000000000000000000..db9415a0220f20d0610a850ebd40d97d824e5c87 GIT binary patch literal 325 zcmV-L0lNN)P)AY7~RBAPzRwPSe*R?;?${vTL|K!R6>-3V3$sMkl+x4+)*f`patg;iXS3E z7Ke&LGKBC5SzeGXC*J$Of4SucFDJHcPSC#>>kpW&g-!6LX|P^*ZlL2OPg}Sc) z2AkqK(KtBU$L{$Kq?Vvrg!4Q{mSu<^CFGrtG)>z#>!%Ka0C5~+>|Nr*IYksj2*c1A zHvU{yRY55Q-}l>+Btco0{|66`#zoQVu57gtb`D*2<4Pqq=v`00000NkvXXu0mjf3(%2o literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/gr.png b/projects/igniteui-angular-performance/src/assets/images/flags/gr.png new file mode 100644 index 0000000000000000000000000000000000000000..094441156c850f5b319b548b8ac5e03653426841 GIT binary patch literal 266 zcmV+l0rmcgP)vwm%>+AJgT&@5BfFK}{SXiuLVzF>=xO8;7kdVlzsMN2o*Tlr)$jIc+&*$0M z?BL+=;oPT4!{Z@tSMV_}hx3+_?D8O%YfH-KdbqR1lIPSlxb8c%$2hAA?gH-=0pv Q1poj507*qoM6N<$f+PZf@Bjb+ literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/gt.png b/projects/igniteui-angular-performance/src/assets/images/flags/gt.png new file mode 100644 index 0000000000000000000000000000000000000000..76c5db709c38745a54eff33e5ae0564618d04e67 GIT binary patch literal 279 zcmV+y0qFjTP)DTB2}mjh-M{3K}B9h*AhD11Ezhih@KVjiNtbA~aNJ-Y@hC zoGu9Wz~LOe;qaSIqB6fAN=qk4LBy)B?@H9W48Q>K1bChoPU3yxznyS*U6&ra|`6Si%EeCE(LU2wBxkkJF!h6+Lm_G=zLbBxw58)WnV4}Al! zkjG*rVy910s-}XB9$?sRfXk(Eduo`OJc{Kcy3HCrz(nL>8v-nKiT##`V+_#mG}$9! d00xLB;1ANSd|#IZjY#s1R+GmJWL)PbW8B-4S11ylyN1AW=}{+}6a4g@*qgn;V*Bf!w( zW@P$5l}855KPjj>I2^d0U+KRA3+I1k2FCvk3=Ci_!Nl^vmq%)FMX?4mJJ@kdK)hc- z8AD#a)8!b$JkS4h!RVHs1!8evsKs#z{uc$(lX;{Emjkx}qj@2(9GHC^nEoaXHU|=e kM;$ooz)=T|I*@n_07!HMOfqvUfB*mh07*qoM6N<$f~dq>hX4Qo literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/gy.png b/projects/igniteui-angular-performance/src/assets/images/flags/gy.png new file mode 100644 index 0000000000000000000000000000000000000000..4f9b232372af90be2e88c42d8cc38c6fda0f7520 GIT binary patch literal 464 zcmV;>0WbcEP)aBOxR^SNcz&D{`*Tt3&lR=54>SM0-|*tgquDoi`0j4t zTgAD= zU}A~!;dr`F1Yr{x{k>`b_j&8TuV+rax?Xd3k>2_&GVK7OqXH@k974i8OcN`3f1VdZ zvk8Q*YX5y)@bBaHho2r!zP8DAM-|%wU()P=ptXDorYu|r8Z1W_3u3Vb8j`Yq???Z8 zyXf<``>XCBiappZyfmByJ0Pf)TT+CXB{_)mJit%j#0000b literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/hn.png b/projects/igniteui-angular-performance/src/assets/images/flags/hn.png new file mode 100644 index 0000000000000000000000000000000000000000..b1a9f5f8dc9573a848f1ae353f384f28eb9a63b5 GIT binary patch literal 216 zcmV;}04M*6P)3Si)n_!+b#_VV)#!q*md>|g$j@Xu@)b{{y`{o|NR%=a47&v0Tmp-_L0gK zfB*US=kLFN{{DlDWK6o2IpsQ>3zPyX04k%h#X#`#{ZC|W$*fz&vu@&1Kpl(E-T5RM zw*UU~?|6b5r~s&p$`-%<^lQa|=g2{g27pp45552@Bi7;p%TA+3=BUNP&SC&iK_odb SS4uPh00003?9) zg#Q7~&Hs~K>;BIvX#T%GK4;(@n7DfN|F(m%|NE7^|F;S|{!a|I`X82J_dh&D{(n|% z^#5rm3;$yufUb7)Xvn@PlFpzFWBH|LdOK|4-7=|G$|$ z<^P+h)4*(y*!yM62i}1{@8AFbY5R6?dii?v*#B>5&w|+?vENUh4ZH&feH6c_sr~=5 zu?ZYvPqTCWKh4MjvtQIV{0C;1fp_4S{rmraIdA|Yia+n%1s12+f%3Xd`zXO#KFt@O z^-uZ(a?p#a8gPh$*w6YV{mt=fxkQQCa=J}>8JL8M{!@y*jLZJtSh4y4&FF;xmts=? zpI@`*zlVACe`=Ub6$ipFt5Cszb|9vvnN)QkE%2xVhrI&<QfDs6LN$UUr002ovPDHLkV1fW$TfG1P literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/hu.png b/projects/igniteui-angular-performance/src/assets/images/flags/hu.png new file mode 100644 index 0000000000000000000000000000000000000000..eeee4cad62a8d50f447e1f93b34ecd29c929e5ef GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<DOmsj literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/id.png b/projects/igniteui-angular-performance/src/assets/images/flags/id.png new file mode 100644 index 0000000000000000000000000000000000000000..e96bc7483cfef3605bc5f0ecadd9a4ca4ce62109 GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&QYxMYDCG%n_oDSfbl*= zxRBg+BctzTzopr0Kg$l=l}o! literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/in.png b/projects/igniteui-angular-performance/src/assets/images/flags/in.png new file mode 100644 index 0000000000000000000000000000000000000000..be5acd354b7b1ba7b726b460807153bb49146ff1 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!VDxcS|@x5Qi=gSA+Ew596mmiQ#QuToOx*V z>a*+Cox6JV*{@%J{?9c2zo+v5|Nl9OzfS`d>wCI5hDcmae&N8%bLH827gnCt2NoQ; zA$zFd(_N?FfFH}64p#hp@k;QS=0YYmDP{(ndHIVrDNMfy)XL!L>gTe~DWM4f3J*OF literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/iq.png b/projects/igniteui-angular-performance/src/assets/images/flags/iq.png new file mode 100644 index 0000000000000000000000000000000000000000..f370c9af58574edc376bd682e60dbacdbc1a851e GIT binary patch literal 258 zcmV+d0sa1oP)0v)a#r7Cm!zm-+yI2^(+P%eCqYh|NeU#|4+KM@xLFC&O9~+F2DTV zf&UTvJHWX2$~x*<9Ce@zXlVQY^rMsiryZRHwxHqslK(rOoCVA09G?aj1JNKg55K&k z+~N;Ezx+S);>!QezrIm7afOD49vBGB00jRB2#;DkYB6mv08eajku)0ltpET307*qo IM6N<$f`n>%%K!iX literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ir.png b/projects/igniteui-angular-performance/src/assets/images/flags/ir.png new file mode 100644 index 0000000000000000000000000000000000000000..7f647fa3b8f0d0a8da6d1a6e926f1a4b1b444eb9 GIT binary patch literal 505 zcmVHk;K-#&fSQn}sKYjsmHp|26WsUoyx-m5_YV)@>B*d)R_Eu<#RV0`-lsn)QW{pP=jGC^R=|^} zw7I$>Yzx-EHMR&Q-C==7>yR00000NkvXXu0mjfB@66w literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/is.png b/projects/igniteui-angular-performance/src/assets/images/flags/is.png new file mode 100644 index 0000000000000000000000000000000000000000..74c9e034aad227f251c6998e294e91daac141cfa GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^GC(ZC!2~1)ZBDHNQi+}}jv*GOlM^<~=<75&H2weY zkB@h?u?f`fud`i{!ycAuadE{$<(mQBQ%YxO>`618rmG9+_ zTsY6p|0t-L+t8sTNc`flfLRsu)dWpvEq3Ewx^5xEufp}s?+b6e1X{-6>FVdQ&MBb@ E0KTO=Gynhq literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/it.png b/projects/igniteui-angular-performance/src/assets/images/flags/it.png new file mode 100644 index 0000000000000000000000000000000000000000..d62e50b293e5f47f6e99d909e7d5cf51c8ba9d13 GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&QtF;Ajv*e$lM`kgTe~DWM4fcb^-< literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/jm.png b/projects/igniteui-angular-performance/src/assets/images/flags/jm.png new file mode 100644 index 0000000000000000000000000000000000000000..a960d3da72caa6a4f5ca2f35eb11fa6f4a1aaea7 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<zopr0C534%>V!Z literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/jo.png b/projects/igniteui-angular-performance/src/assets/images/flags/jo.png new file mode 100644 index 0000000000000000000000000000000000000000..e8b743a3b1a9a9e203be13b52c071bab95ef84d0 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<M-S~K*?$KXP+NV z{=brCLqv_|%^tpMi=+P}J$jQLo*x%tv~=tHKpi{%Wna@Co?4%-A9t~Q$?BsHC5~S5 z9c&6K*o_Jk7af(VihEdARGAmz(!wQ>D?6E`xJ@hi)ndjCLer0$Y!?Dq-I-$;yS8Nk bP^gEY#l)!2=1wIi(BTZ8u6{1-oD!M<;5l4W literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/jp.png b/projects/igniteui-angular-performance/src/assets/images/flags/jp.png new file mode 100644 index 0000000000000000000000000000000000000000..fd1ce056a5dbcb17f68c7eca726c476ade3c19e6 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!VDxcS|@x5QW60^A+Gxv)Q(76pL2-0=#&0* z*2*7GU;h91@Bjb*TMB}7fohyRT^vIsE+=cav+|^TJUxfi_tL~4jyya(t2pXrGEF!? zh41-vgN6p{Iq^KtW*`39ny}Bp&u&*$$>$4ioy+;#s!x8mXOO&IxG`nvihiJR44$rj JF6*2UngBnIJ{14} literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ke.png b/projects/igniteui-angular-performance/src/assets/images/flags/ke.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf559fd0f6c7d24d1180176ed90176fa5035b46 GIT binary patch literal 265 zcmV+k0rvihP)2ew~1g!ri3PQ;6 zkeSc^DOSZ_pDG9fVfeL*qR?8~K&=#^VdN0=<#}FJRVi?fB0|H+Aw-P^I=Ah~ah_#K zXc$elFhJ(`em;_fOi{$_Pz3bA)%QuyxM1}LXn>p6q+wj6di@KT{~AXFUAk_VK0X>o zlPzE;kt06Dsh)lr4MybhqI@FUhi>NDIqIzjZBP;F(FFchk1@LSa{jJ1F$7rG7v P00000NkvXXu0mjfF41cf literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/kg.png b/projects/igniteui-angular-performance/src/assets/images/flags/kg.png new file mode 100644 index 0000000000000000000000000000000000000000..c0fe3e51a99287fa4ac4f1e9c67e97fb94edd1aa GIT binary patch literal 414 zcmeAS@N?(olHy`uVBq!ia0vp^ia;#F!3-o#dY3o@sRIE%A+9e3bzcbSz7W-UDW>~U zT=%7<&P#cnm&)2NRkU9z=)BU_dZnlNN?-Gpk>+ay&DTKESo5{1#%oi}H`W?&95voJ ztG{v4c;l=3CQ$XQv-(?C^|v1CZ-ML})pvoa@1j-S#VWs#R(&6<`aVPHeTMRfWaSUp z${+HSKIAKY$XEJMqWCde=_8P=RQ%YW@UcP1{zl8Aj`LfFa8tieijLMz41q z3=Xnva>2=kYW|@zCw!1N(AW!{WJ`c|2Ct6O!EJa;IZ9n*hNCw~Wg@kKgT%WwFJQ z`Y{lA$z;H5J`WH~w%P2KWf3l0Y`OH@eoy~G{Rwe*AykOJbGZNj002ovPDHLkV1mQe zmr30$mAq&x59HF`Vj;B)*7CO-B%Z7idA(cY)ozhT%SCQCN?fp%2TIY>Vmak|lSE%_ z7k+z0=+g-iAObRg+&k^!Kq(qpd?{S!=`zuGM}&S~5c_ixgn$en_sJ5`%VD(3PQb*R zE%kJ(@W+!P5L+P#$OQ^s$&do(Y!WQ~@%+`RZToJwOgbBs21GyxkP8&VBEEg^&-X8X zeSPuy#m$OQ@lrGN^EG6yWq(7ocs!3&SReE;9t|Vfg#^-(@4mjJf*n57oq+}ck@qwwAUA1AlzqP`BIu^ru06l<@4vqk*|Fr*0w8PJ zp@~2?(Dc5&ogP!{&>{(F@s($n$hYI%qtieZFd87nm8{D}_6Ho<^_g_;YX12B1EqEV zO)p)a=Qi0En;phwv3iH4)Xxd3k%Z903W$35wmVEPL$e^V%y6BKCaI<)>_ColV1Pu- z3qTGlmrmn}ZaQa#)X1{{Y6o)K4WH|`;>==r+D*vUKPaP4w&^H#VCF&J2E)Z>S`?a& zZU+MOT3I(VS(P5LDm_9Kgl>mTTe4NfR%)4!VMmvzbuN-!q_c0hf{l4~^Fv8f^4xD90h zTS=~CXV0Fks;XL9S!r)?k7h0~h=6u8kR7tk&CUP*{rmLk6C)!dvSWc3|2!`KAXb5a zypSy_Dti0&?f?J(fB*hHefo4{$9|YAbwxwG z>{wtF-M)Rhv$J#0o;{>G7R6}Hkd={<`TqSoFm279JC{_)B8v3E07_x~ U)C{^nV*mgE07*qoM6N<$f{!7l-v9sr literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/kp.png b/projects/igniteui-angular-performance/src/assets/images/flags/kp.png new file mode 100644 index 0000000000000000000000000000000000000000..3fee379506191676a414b936ce245c2e2da92589 GIT binary patch literal 343 zcmV-d0jU0oP)j|4v*2#-NyevH*Nvr&ncN;v2T;7L&P?1{r|PTdEgxQPF45+|F2*Ff30iA znkIj4-unON_FV()z~8^Y(fNJeLWG>61~_^_U_c!R!oSa+2Rr0zOUM7Wa%#Yg;SLc$ zeHJ3#)-^aX$;ZI(|Gy3&h2-Q()Bb;L?HnAL1cX0j<^TVC|G|G`@N?Im!BNbh7t~)$ pDhFRdJz!Pcpl>XUwg-p10|B&oFB?sB%<}*M002ovPDHLkV1o5#vE%>% literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/kr.png b/projects/igniteui-angular-performance/src/assets/images/flags/kr.png new file mode 100644 index 0000000000000000000000000000000000000000..d0022a2e7e1f223594a7d68cbd389658488d64dd GIT binary patch literal 521 zcmV+k0`~ohP)mMj99xbaiz_L`2|sGEgPZT%h7*%a*NNxe}kz&z?Qg z*4EC;%d4!c1Tx;dc>@vuwExK6sEo_%RzP$wF6Yz1;}CJ6g8u$~pkkmFEiEmecAQ4P ze*JpYs#T_@roq9%>({S`2)>-Q;GCcu8UhMJWY?};8yFY})B@B9)J`C*Z{EBKbOnU{ zc;{hEb0G-m6^NSL+}s;CZV;RJ;9yB~1)7Oxgw!DnU=Wd$uHnGXt?De2xt$7bg4XpC zRyFAw;lOaG$Y@d5_H>P~ZDNLdMfF?_(i!aAA&AkweXgz_MMnD+ErpoHWY-2a7lN7s z%SkpGIU0AJzK>=i935G^pM+?HBtA1UGvvhAzxouWxj;eW#0S(uAn`%6On!d;lqpk? zv&`PJ4}xmfNd!&;BEPCNK(8QY8K7dI76MrYlF_50q6!NOJ3Bjx$>_k+2B>)X^5q0F zI=pxSmOB;}7Q_@!KxKV>eMA*c@Iv*{rAx#Vsz7BV6sk0=3aAADG|AN0bYbZ500000 LNkvXXu0mjfO)Tq* literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ks.png b/projects/igniteui-angular-performance/src/assets/images/flags/ks.png new file mode 100644 index 0000000000000000000000000000000000000000..e1824f13786add0772245b1084197f74ba48e576 GIT binary patch literal 357 zcmV-r0h<1aP)NiJ&<%O+qeJ1OPjpiVNFMV{{Cy5zZ-~v3?LUM z2$TXUfGZ}-XrRthH{Kd&?9fZuwruYMpiaf8O%^%3#DdlV5s(4o0tJCmKm|Z$K*c~U zL>Ud#JZrZ|zMN!VKHrj>M(f3N99^#lG#7|Io#1Hd3Z#zFjh#Vv_lQBvg`lSg1Q*V>Gf!xy z)M(q}I%IPp=)-X?_3$1l1jx+kPH0AV_xVsKtQnn`cJ=!JO?-YxVDnPLsZ(9FBfF@U zLbRf~cCXSA^q$4xwvf+j4mA^>eDI{^?!eLVni2#61SMMe&g}mq00000NkvXXu0mjf DuezGr literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/kw.png b/projects/igniteui-angular-performance/src/assets/images/flags/kw.png new file mode 100644 index 0000000000000000000000000000000000000000..7f701d5c059c036cdd400fc08336903f509f780b GIT binary patch literal 224 zcmV<603ZK}P)mUp@ aWDEe#+(z0&=Ogm~0000Jc5D;5#TNtskS7!4TdRtt(x43CxwE!99Tb#YCzJFi3?Y4PD>XF~PDPl*j?e+yu+h>RF=u_IfflP}7c208GK1XTu zMq)GwY}(_ueNxq)(wE1zUmeq`-&5qXV~WtGJ!Jbh!)DujVl?<}pX|DA#{ZKtaOAdq zM&QngG>>DKZL@0klptGNx3}1J`%H2yZrocyOscNiQw(&X_l~L7+vfi}DGRq4$o1bb zDR^gp*`5lTSiJsV;DQ6uTpJIB?(9w7)pF^m)#W3WnY$Z9cJ%XX+`sWq;M@bTq*?5@ zeRA&Zdg)DD@hhFVKXKi`Ajj>q#WrmZ-_h%^Z8k7=fvH+@({{fdlXo5RnzS#KG>emW zwF0w~)wTurmC9|}eCV)i@t&%H9g~U z0j=!bmle6Q2UyrO?kULJ)i7s&T*j^@U=)OI?;|;JW$kY0BRV?)k>S?mnY){IAMz^N zU0u1mY{`KLU^PQdst(*Sv0!&KNkt~dhC}(gYJd?0Ov$EOmylU<0aJDFzKj8=Bx?4Q kH0~=H0E-8#Auu2a0Jm(fy#GMYlK=n!07*qoM6N<$g12-H!~g&Q literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/la.png b/projects/igniteui-angular-performance/src/assets/images/flags/la.png new file mode 100644 index 0000000000000000000000000000000000000000..975888468a318eeb411ceffa720a1ceb34b94b75 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!VDxcS|@x5QlbGqA+8J>8B%uT%eI_4C#d%9 z)rVJaKmY&#-?}_N2B^Tq)5S4F;&QTq8!OM0PaByP#a&bMk|Uy4F$m4q)YbK6>^#r( p#QMR*#jD-T`S04PIHdk(Vz51-c2e+I-7=tl22WQ%mvv4FO#rJ1E|LHM literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/lb.png b/projects/igniteui-angular-performance/src/assets/images/flags/lb.png new file mode 100644 index 0000000000000000000000000000000000000000..80b32567d3d7855445ace2f3ffde441706bfe00e GIT binary patch literal 323 zcmV-J0lfZ+P)7MjveX`0ERGjJDaD!@kgkYmvLe@<5)& z9%9P^>d(#p`|mGBMt}YNz3R;Dz`ZpIKdGR?5_Ho$4{N%(SQ#ZyoH48Yg*GG04^&XE_Td|L- zwa{49?5i%YsI2ENo~weyWM{WML824CZn1+z#2b(z7e)R#GS&b9002ovPDHLkV1m2i BnZf`7 literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/li.png b/projects/igniteui-angular-performance/src/assets/images/flags/li.png new file mode 100644 index 0000000000000000000000000000000000000000..c635a63a243670160bd8d3b3e8f058047a8d4e16 GIT binary patch literal 226 zcmV<803H8{P)&HgF(=kflrHH!P>wffQD(89{GdH=$xP$t&*2o&W#< literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/lk.png b/projects/igniteui-angular-performance/src/assets/images/flags/lk.png new file mode 100644 index 0000000000000000000000000000000000000000..12e6a000c893008b29bd1ee9cae12b7d195a7638 GIT binary patch literal 665 zcmV;K0%rY*P)$+38~rOD$tf`^jSNVRpDf%(f7 zy!)axf&M1P;`z!Tzs^&#ff%<3^sUkPKBp%Ndda;D>Xom7)O-o>yA5B-eR4)Sz@T;v-RJIrxuTSR*&Qr7jBA^BD zH*r0fF8pyT2U=Nir(cZ97H@PhI9DbM%-KL&@f1?PD4@2*P6pT8B|q1Iy#l7_+Yxoi=})(*`G&PK5pYUnXh<%n()6f zj7QQ`faE3@1L_C$&2I7KMrJEbP1o2M{XNCFFG>SaN&r*Vx4mqu%uL^J^y)=iL)QZY2S%WFF2GUTJ1Z zMzy#%N^@6;7Q$kZ8UnZb#3*S9+(m8(3UtP)Xn&J#gqUxH zn01Psdyk==thvM;K*~d4&R22O+u_%XoY)*c*`BT6M`Pn$b>->o=j-n6m8I~ixAOG% z_V@Yv>FxUa`}^ze{QUj@|NqlrBEtXx00?waPE+mf_V@Vw{{HGjZpHur0DDP9K~yNu zjm|d~!Y~vC(I;cUkaIMS1mpd0kj5M;$^X_!xD{JgG8B$(!wBBXChY{ kIP04l16kjEZs3h?U;c<#Ybh@uhyVZp07*qoM6N<$g7kBw@Bjb+ literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ls.png b/projects/igniteui-angular-performance/src/assets/images/flags/ls.png new file mode 100644 index 0000000000000000000000000000000000000000..ba9ed2d383caffc2b20e41beadae213f0611d1e8 GIT binary patch literal 216 zcmV;}04M*6P)H8oSGPCa()7*VcfnCeU`G-~v4Fd6_X!mh{m Sk!3Uh0000$$xeS&uBc>Pzopr0LIlM{Qv*} literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/lu.png b/projects/igniteui-angular-performance/src/assets/images/flags/lu.png new file mode 100644 index 0000000000000000000000000000000000000000..64b5dd6c964363e074c3027ad6673493f84e103d GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^ia;#F!3HFmgF^~|l!K>>V~EG``oyt&(S RyDZQw22WQ%mvv4FO#n7+C$0bh literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/lv.png b/projects/igniteui-angular-performance/src/assets/images/flags/lv.png new file mode 100644 index 0000000000000000000000000000000000000000..fb8345e1365723b5ef9578d7e20d278cd26e654f GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<<$P6TpcD(%oq}T#{LR{O#l>h(#Zy?U~3MeAv q>Eal|aXmRfLGTYdqmD`^1H&2?;kO5(e&_*Z89ZJ6T-G@yGywqOm>5U^ literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ly.png b/projects/igniteui-angular-performance/src/assets/images/flags/ly.png new file mode 100644 index 0000000000000000000000000000000000000000..b90fc936ebce690b6ec7a4ab4a6a27544c53f40e GIT binary patch literal 244 zcmV9q(~KOuVCvDJb_i(t+d*c*oj^tkjgflkYFGO5OffK zzW&YN1;Jv6!*56yctWti85Rp{EZ_HwqDYd&wr#8y5w&fb=Xn%G06fo=QaX-Gsv*p-UTl|H1*sF(s|EQCy;!UrST)0$75te` zu?bQw8cPhhZ0%WPVwnuwSuEUHJC(VqX0&B6t8zT^RssH%5`2Lk(Ur`T} zkF;@2YgS*>C$p=Pt3HK?9&!Bi1mlAp%u|~R6<#Ye?>k4l1UI%+9#vQz&= zkN$BxDG-;3`vw%5geg`GlS1F&l}~4Z6o;6ptq;ovzk8YA12bMC?S4>JdR6 znpk{HLGbiM!*g8*hm-_P<*J>ER6L!ia;8KJ$UWPvd$P~)n3f1_ELIXaJ=6I7Qj0U$ z>WBRm*0zI<7ujAXPW>Kka4n8Z&!oKfo@}9Sw=G->xiD{ z)<4R{eL79`)NB(Ficvbk%6Uv(=m-ZVjf+f4UQpJukT^ZT=+q=5U|~YA^CkpKVy07*qoM6N<$f*0)Gx&QzG literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/mg.png b/projects/igniteui-angular-performance/src/assets/images/flags/mg.png new file mode 100644 index 0000000000000000000000000000000000000000..4b4b065529cdbe27ecda8cc29887c701571d71d9 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&QaYY4jv*e$lmGnxZ_k`p5a%(s zG3J0p)|V9*7rO;t%s3|7x!A2=$~McSwug;jqeh@^wQ!FKP#=S*tDnm{r-UW|JzySU literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/mh.png b/projects/igniteui-angular-performance/src/assets/images/flags/mh.png new file mode 100644 index 0000000000000000000000000000000000000000..3e7a4b5c8d94323d7948761b0b2a7e0360a551c5 GIT binary patch literal 821 zcmV-51Iqk~P)pN2J)e4|l_NYt!!@*t#Wd8x}o4oqs%Xi>b{RgxUBJuCv|1C%ETcxfc(xWOq{ad>d z?$z)jTlTm|>%*b`zhB?}M*<9x^r;)Y3>bgF@C5n~E_dzzJ7DlSWUT`RIJ4ChT$XA2 z_3!A4yI0MP@KzP)%jL1(?;rk;4Iq38OfNtSfZ+-B9}xWh^LNgstFCz)@c2?EpnrFF zG|&Qsw|aFx9GUd@+dE8~UcCJZG|;bf3&KjE(ZKWqj6Yy_0{sV+4zAoLAFu$cWd?!0 z`+6dQkp%M=*Q=EY-ya;qwCVEQH?0d!n|A6*!*iA#T z%p|z?Ku`F+N_MEX`t&{?o$~kl2V`r0{r^y9p~LyAEQvA7sh2xzf=<~q#qv<&Y# z)Dv>Af)(VgYVKF7l72iqfo#*ePd}FKycu4zgWm;j;e}NcEj;ZayN~t;-YsVVTJ~gu z;m70C|9<}nx9QH44}Hte15+7`^;Dwr5>`=o`gDx$KHlqpx19NYHP5RxsXrc{hFJ6W z@4us$o|R8Msu{6_PWlT>d8h<=7^Y72kK%2gN`?c=C-Gt^nq8@X| zFAFh+d=ffO_j=v0<$t|4HP*Z+8pjdw0050A zY-vDWo!1=x5DRglOJuDM=xh@$KTHt1D@mOK-Xx{kEq0+}aOwm|P8EzdjL@|($_IQS zij}YjN}05#6c&4;CR5j$6omajdnKK+bfoI<*ftMsUFC7;5}HoHloIBKue_?;&%6oP zq9fU%GqNw24YIH1gyD~eKXCpN@|S|YX6(gfe}yk}lOmlFY2iBn0000nCjR+bfY9Pv)uoKe5O zcH+sj+I_A`8=Iz{QgvHQeam!wmIdc-Pp{j*``F{Q8K>9myt8uaZQH1Imf>rtZ<&Gr zipZj!oA%wGzwTOo`{9b7qdSj0%52zQ+;N2ZmH~axIOWvl{rBgsy;jkGyu9!D-V=|L zs`hlxIY)iVlwB4%#;wn7Idt{*+w$&XQX_7!?shrOY9j0O;3-_5O&eJi)%Pf*9vWybV iqn3?YHfq@jw+sNfqe<6+=2e6M0000s;ZjgzV19h1XM<(feeGl;-^6pcO>X;@jV5Z&zpswcuNj|k6&hp-&K~Tx5ZC= zCBI)3eA6U)M~aRX1H<`km+0?T{6M=O*-O&V$C5H{+C<+^6?xMl`q)L1u0j3KQWEIt zXOR;0i(_C2e^?~)EL`&2aiKR2V$ajWfg;Zn#OY))9KGuorK`mc%%xt}i#_p|1X@W~ zi@)v@`m$H(+Y!N+#bR`|_|qC;V9E9SB|p6_eqbu~szU5pgao~VdcYFb0A!~T+z_CT Z#Q@`sIB{RwKRW;b002ovPDHLkV1i53dlUcw literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/mr.png b/projects/igniteui-angular-performance/src/assets/images/flags/mr.png new file mode 100644 index 0000000000000000000000000000000000000000..caf03659f0bf43b2cd8b12de19a348ad368e9eee GIT binary patch literal 304 zcmV-00nh%4P)a57x&N? z_|O;n&=&jA7W~l`RVDMB0001UNkl5!7f23ec+O21>j3`x#UCU=-esbEtp&m>OSHn z>T8a~I9IW4$JIOv48l&SbycbhF|x{L7@E@JA3Ood4+V*b0A6wc0000J%-y+V)9!7XcJJ7F zV8Y~s6Q`UxbLPB=_LD`cUToa)=k2@y|NoypXm${&-oVqvF+}2W@{PSkU-J}h#PKom z?7qD#@P~GjO_=iM<&rbbx=rNoiRksWZ~G}=5c7j!YWv3E$xlR11NAa^y85}Sb4q9e E0M~m!I{*Lx literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/mu.png b/projects/igniteui-angular-performance/src/assets/images/flags/mu.png new file mode 100644 index 0000000000000000000000000000000000000000..03f524f931923ffa45cc95da3aa00028e785ff70 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&QbwLGjv*e$lXoa9x+@_VTf|yDDFNQ{3IY>K`k^=}Sw@4^-Yy0cvLOboFyt I=akR{0O3A1V*mgE literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/mw.png b/projects/igniteui-angular-performance/src/assets/images/flags/mw.png new file mode 100644 index 0000000000000000000000000000000000000000..bf38ff9c73a1ca5cdbb213e532aebb4bf99594cd GIT binary patch literal 261 zcmV+g0s8)lP) zI5{}#|bV$~O_j8_n++22FdI7iR&KH7Z_rN0AhuT zWf0}E3hYL;Q0#P^3swjqR%9TYP!YBIKh*nVQV}%0%qpT*|AqPvsDHHle6DE900000 LNkvXXu0mjf3o~<* literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/mx.png b/projects/igniteui-angular-performance/src/assets/images/flags/mx.png new file mode 100644 index 0000000000000000000000000000000000000000..783148b3e9a3d410a52d88321ff6c70e72f0fbeb GIT binary patch literal 309 zcmV-50m}Y~P)Tj~GU68nuZ6n|}QG{PM=pbuIBNp;l+MFQ=hR4{vO{ zvbJhNTYRa9cCxkdty70+V$-L$H!fV*wr5^-Ynppkv{h4(Zf}||^=*3a@Z$ITx9?q8 zabitvcbZ3CYUuW*GZ*(Y-@AX7$~HZEbYjQhV{`Uwy>o2MjzyCzQ~amY=0AIU_x9~W zRJQ5qvm3W>9$0+pMAf$K*-K`YE$OXWx9RS!LwE0=p?*AFzPk79?Njp)ZC*Jsed(?> z4j2N|PNZ14bL_ZRdz+r5G00000NkvXX Hu0mjfvZIsO literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/my.png b/projects/igniteui-angular-performance/src/assets/images/flags/my.png new file mode 100644 index 0000000000000000000000000000000000000000..5a9ae417fd6e3d2d28ff1b169370e494585aaa26 GIT binary patch literal 416 zcmV;R0bl-!P)-I_IV>QxoYi6#9*aNBpG!7Ex45M(_~l{#sGI@;`$cS) zEA<2WRJ^B3yUu1YUj^i%DgJf$4%rCB;>5!2pJ!QsK8A3CmWesdi_6Q+EJ=&b&F8gU z!fmsRCP95|hs?aGPH--l^)i?E`U9)9-yG#Vvq?FrFq_$IHM07z2M>^q5EcWY^UnpQ zjFL3C2rz`(+Jk^$@c$yizYB~L`@FUNCs5yFAbNF#uceAX43}mClG1U^6u;YS<`$QJaut&DQ zBeB{dydCI!%&bMt>;%k3Qzv*FS*tO9qI+(6ig9QcP>{)d4Lu4F;?aK!0K=}>LbB28 z=0>s+!$Vic0YMD^2M91cON<>5G;kIVSWpjG;-Vx=P?VhpDyRWD2!|2xnDyoW0000< KMNUMnLSTZ2s=HhO literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/mz.png b/projects/igniteui-angular-performance/src/assets/images/flags/mz.png new file mode 100644 index 0000000000000000000000000000000000000000..0e4c983ce87bf89db064ee8345722b49767cd8fd GIT binary patch literal 420 zcmV;V0bBlwP)=NOBm&ZnOj&`q@<*jmzQrW@Ia0Lii|Gc zlnJmfnAn#$eR9#3^&JUDrql@#p#DB?<+n40-t>#yG}8XOiRW0j^bvkT>O|uuL6dtv zst{*h7B;@;sRk6eQ=I+$-ty-UR*;RbWSOh-1|OF2|9QwjAwoC$wvFcZ6Ks^5i*EFj zOu6587^z||!ssi~hVNzzQp-?;(ZHhP+aV6>nhP@eQG&wnTTE0p7l;6ELz-|8jD9l! O0000Ge$MLi_dm zRQn8*cjv*GOlPd&{xLGDin6^$^ zw&z{%G8w}^$9ezN{{NHt`-}M3cMd`)jx83NuepBLp@(^Fn@$=&J^x#r-)X17JpQLl zT|5&suY45DTsXU6*Nmbg2X;HoE;7mD()DFzc)tB*+_b69ia?7PJYD@<);T3K0RUix BI+Xwb literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ng.png b/projects/igniteui-angular-performance/src/assets/images/flags/ng.png new file mode 100644 index 0000000000000000000000000000000000000000..ba56e9e06bc0da3dd6bef3e5897cfa51f3086288 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<<#0(^xG^T?%oB=)|t_ vps1&dV+hCfxP~0001ZP)t-skg@nI zi;OLAM=geaQ-}0qeV~nrc8-gCkBoJckbRbsftZtjnwNs1iesXnk*(06vah4E*RHs> zs=d3f#lpDC<e|=U&fD40-s08a;M?Kg+~wuq?Ca$7^YQxn`TP3# z`}_O+`}X|&{Qv*|Ej$lZ00001bW%=J%+fSg{Qv*}Pf0{UR4C75U?Bt;hK>rtKph3h z39<9ZqY9y_P~=qQRpwH{qe57MpH)yw1dj@78D=I%aVb11R5(N>#dy^4s8Cnn7GRS_ fb17jkjN%pmma-v?fscyM00000NkvXXu0mjfrGbjM literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/nl.png b/projects/igniteui-angular-performance/src/assets/images/flags/nl.png new file mode 100644 index 0000000000000000000000000000000000000000..aeb72b664a768827bd8ca879d0c904b5b34831c9 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&QpTPxjv*e$lOxm@J1QSB$ojIu z;8#ePV6VX8`dN*Ei`&~T?p!-NvqeJW?yk%hw_Z6hH)e(}^DgQ<>FNIf)Xw1P>gTe~ HDWM4f7d9gV literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/no.png b/projects/igniteui-angular-performance/src/assets/images/flags/no.png new file mode 100644 index 0000000000000000000000000000000000000000..e14f90f33d84e921007bdebe61514ef0b7c75c09 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^GC(ZC!VDyH3LH)WDU|@95LX6`jMUmC?Xz~Q-F1Hd z$(zq#e|)d4`?b2}`_yT__U`+AoRPl%ev#>lhf zaal=837f&&7Yz(-;tB={C5=pMe;9lXX9a%w#KiD+O?>mRhsuFK%?zHdelF{r5}E+% CY&f9+ literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/np.png b/projects/igniteui-angular-performance/src/assets/images/flags/np.png new file mode 100644 index 0000000000000000000000000000000000000000..fd0cd6e626e9d13f65156dae3b09a014ea11fcef GIT binary patch literal 490 zcmVM6gOEGCu!4PqwQ02rPpY4cZAzxo!?5PhNyI4`F8|DvJ^3O+5S^*=>5_Ak3xPdCsY z4!j23i_86gN!jfG)5ab!2C+e6AlIxGGyP|vTlNBIhyzXoZn}s6f8I6q|Nnpgz!<~^ ziNU;d28c_PLjUrabSwcHB!D#x-mcj2|IgQNU<_iThYJXA7194^tzGyTXh;awK)fKO z|9`)%+5dhSm%q4hudK&^C+&j&KtnbHu{1_3fSl{2l?_r*1@4Ut30*J-8RDgx z^%JPToal6LH!9=*)A}wj2C+egxNGJ702*RU(15E(F8|-I+z5{a5E~?RT2TGJi+1jJ zpdki$4FK8r<>a~lFaTnM#6T`P1vJD_JMSyd5FL_T01KOwKtt?w3cdgh(Ih$y(9^&P zpdrvSpoTLu!D0bhA_C##LK^>p<;Mr0AM@4N0Ts+b&wUUr52A gQVeLoF(4KK03pGx(Q%`v!Tw>&6+MNIkH?3S(b*PlOs{rQb`x-Z{;`SJ7j|NsA!^5!T5O>p#d zaSW-r_4bsy5QBmM%Z8J*TH@w-)=s>_^(UbyNz>A!OiOK(ZJEM6&1>fiRXVV-6IPT^OT4Bq0bA z6O0n^Vv370k~v(r*kobG#h@F+VCI5$wcV;Nwo=yhW9#?Fd0)$wiH3`H30M4b?w*T( z&YSlo^qq5L?V6db&wO;v+55p&_yRDjh9LXw^h-@=&w`Mzk00weF@Q`8d5+Xt56F{U z($FSL1zMlW%MX*V2fPZ)#VaKHe+V7<(bMR0eYm5cbLe;>-*fH?0)H&bW~JRh06|we z=9$N~4eg3#m&EgQy%n{)$4yW5kKK5)dfHS;X*!POqH&^pv@>QgH_Bs&OCtN~9>bnz ze^pnW?ESvIuDWUXWpJEh-xn7zIZmn~4Ud;&{rVB}6BkCON8h$1Hxs()))+HlRD$K= z6r_J>JRDpM-Ak6&!4|_X+w4nPB(3CiIdW+edB-r z{kz#J_K;9S z`$*b**U%o(rnR|o4MZyF^8EQ3esxxi7xTvwP+ItCo|CAlAS~p3qTHgFg`)zpQjRhZ zsTA-BbMY8&G|6i6yepf@QjSm*#uXp~!xNEk%s&^Xs;F)`xUDP~=LUyRV_Vc|TWsBo z(n06@s>-!k3N7_q$rv_%W46vZr;Lo(=&@%7M=d$j_Fk++wd;-j^_we|*GBN0^M-rj zw8P)o+4OB)0E`X%ocOY*|5V40n(bTQ7!&&XuIJR>1+)lGh3sjKNhU6$2$HrF-G`pv zwAt^(@K=rr?IHE;j_Ku*nV9Xs%ZRLJaL8#X4O)lN>yCX5_N* z=v%EvJ6>$ITyJ*&l+0w9$e}1C?O4T&vFMhq-rHUSpI53BpbU(amI{103qaIJlgS(i z0nf!26MkQ~YMoiX(F)%kao!Jw9E=t7oS4@{S%OQaP$okG0|@R(WW>@^0DLluvXXx% zLJ&`hnLH_x0!o%=ASmW?iAgDFR)m11|BO<^P#{A2ze#`uOaySRS{x25^)UP}eBUsQ l|@ zC4K`Ze*`Cg2rGdKErJa%gbpx-7dVL-If@=Wj3hpaElQIwNs%#1k~c|@N?4dsUYt~7 zo?~sKW^t!yaHfQAnumI&i;}yGle~qTC~e~a007fTL_t(|+TD;>4}w4tgip_ciWO1H zVPh%MR8Xq_|95$ah$cLc_~yLKX68#ayT}P{B1Q-i074Bf4a-Ay;xxyj6A^8x=8|>v{kH002ovPDHLk FV1jxn<;eg5 literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/om.png b/projects/igniteui-angular-performance/src/assets/images/flags/om.png new file mode 100644 index 0000000000000000000000000000000000000000..05c99d92a3b86b31c53dd5df579d4872617ff43f GIT binary patch literal 256 zcmV+b0ssDqP)O1hwnGmO;@SbTKWurb^6Fi@tQB+gt=Qiy3$qbI#_0 zBfQ1>y-J|;av<{3Mh!%h5RV*?iH}5+@yce!o+_}2tY#q7ah8X8GtX!20B@%Qp1UO; z-VmYhB3v&J9QW)1Bg;Tw>IhUBf!so>G?5w|woV-PGhk0eVzd$4CR-7{=^*GItxv8ft_*5Emw02un9P@4alI$?)7vrRDPu{Jae*f~c zJCa$NDHo)9dkh~5dcKpmzaF3K?#~s~9>pceu$Zw`V4Ky1dHn`JXEAuX`njxgN@xNA9OqA$ literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/pe.png b/projects/igniteui-angular-performance/src/assets/images/flags/pe.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d623e8a14814abf07a513552fc00d5a924a466 GIT binary patch literal 91 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?$P6SGq{_DgDYgKg5Z5yd4FCWCKm6HI2q+@p n>Eal|aXmR@!+nhd9??t;&%#AS<1G_`QVa~9u6{1-oD!MZlpX z+_+I&TMJ~1GqKF$m4&FgD5LryR^d^y{PP-Fh*@7YOTKKDdEG5@NlBG}8zUnlZES2H zY$gVVY)+9gNE$9ksJ-ry`MzJ`>jp_+I6TRf1Cj(xgaalfCJ4ivm1{RYN(h`6R(qT& ze_2`OuD{}4e+BF&IyyQc8z&$jP*hZ8W@ZL4SD1-;I*$yp&I{sd_d*pP#3D6@TU+A_Uw%gBi9FH-@--R|6chx80|Q~3kKne(9=RYB! uN;rj+1XP*X*YPP((?lTPWMpdMmH+@vRY<=(6>!x60000=T z%nV`fJee`$&b{AvOw?({V`c9B_wSxg=hUyh?!7^)2aib=t3g>)a+jbW@Rs3eHoRb7 zUie)ro+o;rW;@^5cN~(fkP9XRoreURSlE85&zg0*UnRN|LM{C zzFejFrh>Z~bnGHG42Bj;x=uCP;>v({w7-2$&V9NUIJ3UFO%;(8D3A8f9|-au9=3s*t6K-B5YY~(+*7g_wV21caNDfn8`GnF`e<_ z_m7vKUdGhF;MfA~25tFDc`}Vwt5pLEe)#qQQ$J@mCq-cmF&YRo>NKdF_#goS6yJVj zJ1&ES3x&y#Mu=41raGWaXtF|uLdw<36eT{0?6%9>9C{oesYRqnBy(wI`MPpSv&{WB z_u*>3|N8#v`zK)H113RW-l0N9Z`#sy;N}5fYPtF1=CV`Eocf$b3)O))8UPcR*EanF Rcg+9*002ovPDHLkV1nGKk}&`P literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/pl.png b/projects/igniteui-angular-performance/src/assets/images/flags/pl.png new file mode 100644 index 0000000000000000000000000000000000000000..d4db002f655c3592b4821f0fd8fe2b7e6a9ddd5c GIT binary patch literal 91 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Ev$P6T}#joW7QfvV}A+C2sZ2tfM|9*$*C7_6a or;B3<$MxhN{46{wf-1}mYXjA9=5Gqx2b5#*boFyt=akR{0JXpv9smFU literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/pt.png b/projects/igniteui-angular-performance/src/assets/images/flags/pt.png new file mode 100644 index 0000000000000000000000000000000000000000..e0619bc9f66ec02e64f3a4f5dda366c0d3d5dbac GIT binary patch literal 395 zcmV;60d)R}P)f#6Rw}a*Dzy=wXC@zQ!&RBi(iO%@k$rkD>zSS=7G|NioSCNq|?OnBQ-Eq?Cr{^-~b|NYAE{y+Zpsl&g@ zUsjLq@2~&=-Z$@u{H=E%>p#Bw_J22D-mm)dAmfNR>-u(BFZ^3?aY3-y45+o}`JMme zzpP)p=I|(q`BlGv%ftU4UlkefKDun{dqC*f-Qwq({xe=BM)&iYq$O;K_*j47BiKn2 bvWyG?_gYu0&M3S9bT)&htDnm{r-UW|$h2&G literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/qa.png b/projects/igniteui-angular-performance/src/assets/images/flags/qa.png new file mode 100644 index 0000000000000000000000000000000000000000..0e615feb7b8d3989a1e8da70604e027d995d65c3 GIT binary patch literal 229 zcmV^P)00022NklceOOWHwQI}Oqreekw| f25HNY&aG_#Iz9e26>v;r00000NkvXXu0mjfZZ>8! literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ro.png b/projects/igniteui-angular-performance/src/assets/images/flags/ro.png new file mode 100644 index 0000000000000000000000000000000000000000..57f34f3559fa4e776ae44f5a9f6eaf3d71eec89a GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&QktGFjv*e$lM^niJKp>+M&xkw tInGrN9eEbJ^-I}ieOYl4%n<2iV~96Ar60F*dLK{|gQu&X%Q~loCIHsR9l!tp literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/rs.png b/projects/igniteui-angular-performance/src/assets/images/flags/rs.png new file mode 100644 index 0000000000000000000000000000000000000000..7273ea715508cf0c31664300d00890f3247b4f51 GIT binary patch literal 523 zcmV+m0`&cfP)N!x>N;|#o46E3CgE+uxNwk6uz{ELyGZ&PDY%b0|FP1#gZr^6 zGOw!#-HPSfQ+Zh4@3Bf*lp@Ou{=U!F^-F73xa+&s-}z(ys9yUq zoI=gysf~Or9Nhgz- zrpcJ(V0b#7AU!xp-rL3pRb#F@z(g>Fnah!qWCuU?2YDbKCM9|(_Jv6uZDjItGe#iD zP*0+=ur{@5mGW_@LoZXYzi0pe N002ovPDHLkV1gu+d~p%m z_Q|bmcS>d`_)fECe*bz}JQoYkAO3ZpIuA_Z<+0)3cWdTc9Z87_kvnV3Ou9QBvxfi; OVeoYIb6Mw<&;$VeKO`Uk literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/rw.png b/projects/igniteui-angular-performance/src/assets/images/flags/rw.png new file mode 100644 index 0000000000000000000000000000000000000000..5b859eafaac9c64a90a35009edb019b9b7f8bde7 GIT binary patch literal 285 zcmV+&0pk9NP)bN>;YSYPG-~t!8_hn$EM!MX@Qz})O_|24BKc-p0~sYp`|=KVdTq%G-BAi;cx=wfKiuWL zCD&|q3<*XXtPG!YX?gqEdCnWtRG0Xftd5G@RWbYOI^`ukSqIyI?A${gx+_9^&M&fC zpX9SOj|8Jxr<(u`_1&7^bb6NG)_kK?k*=FEfX**G(i6SA%6)TI&Y=$ZMV^@lTO)Rr z107C+(Ht|(fW`q01!|UZKENKCf zysx46!lIz<#Z@OJ15E@5Zq3Q5zyJ}Q=LigUV3+{S1=?Z1K3QskD`_c&ajGFOSb!uD z@y@b_cm)zx%+rh@YJdzT7<+_g8AuS3Z?yP)XJGoRJ~0ItlV!&y08<{23rsVq`%0qLGO@_}yX2m|<)*^t!LvQdwH?mh^3UG#&)@RU-}2bx^xo+9?eqHZ_51wM7XJSK zLY?sv0001$NklEGlklDa%S*`q%0E| z$`ra;kF#S;VZMjO1AYm6PMAWhp9)g-UMW+U$kU-rB0uHO7%9Rm!U#0RGZx8M3@VHF Y2ljRqhL?}c_y7O^07*qoM6N<$f=d*ZjQ{`u literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/sc.png b/projects/igniteui-angular-performance/src/assets/images/flags/sc.png new file mode 100644 index 0000000000000000000000000000000000000000..a497589e61fa350b09679a1f349aa60866308bb9 GIT binary patch literal 467 zcmV;^0WAKBP)07@?p|wC@96GHxOBFy@8-IpO&~Z-Aorx(!1T% ztneTuy0knK|3UYI&OiL-{|CMdV>y(O>8#;)pLaFit1emXq-(auFB*i3UN57Affa5& zkKh_XOLp)`BG0t|y7vPGwXlB4*%eleIS@pFXj(L>ra(L`o)ib-Y4M~u5KoII#V0zQ z4-A?XPl}^nGnt!@UQdt*#{g+HODZ}XwJ~by7$hy86i2BB^0&XIZG=ct43$n36b$qR z{RNV=?39ExV|ErO3Z!XUBpc*5{R`Pff()4k`kthFE z8xM9$N_3h0*H+K`AHP1qq(YYCkWA&Q|FeC0+14{BR%~#!Y-4^HxGn=E)BS0gqrg)O zS&qYUs`J+8g_X{!2)kOIqhR33-n1cY`S<_Y=kx!|b2v<4cAT;L(1-tfCcg$5Vv!el z^uNCS{$8ts3fGSd&Z*d3lv*FM^{W4h)vM*DIeKn4R=)Z#xrMdCEZ?L@J{K}r0`?5lz%qHf8fv4;{WZK>wa1>qoqT+(9rWPB+>mdKI;Vst0GSnS)c^nh literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/se.png b/projects/igniteui-angular-performance/src/assets/images/flags/se.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1257830378de63f65a7ebce12d02e366017f81 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Ev$P6T}#joW7QfvV}A+Fp3o&OIqaL-;l1t=os u>Eal|aXmR2H};p!iGbze=rzv#M9&FEiK7ySSK|3^_Hkp0!f>-XAiU(J1}VDz`p z^#A|<{W)^#i>~uGzr-&(PT%A5zvzM4y3Q0C{j+x_(8)jhX9L~)=irGiMjjw>eb+zx zj()WcppMZ{2|ZVc(Nql(Alp0s*V6UCF!?oi#kbH5YDVK%bKh^?aiGX_i~4FCM1#af q-E>XmEc2gcVASYQqeqP<2><~3kUCUpav6pI0000AtgI$6AN z{xzU|B6cr;2*_ADn+6sGgA@~W*PeGve|zl0&!gvm`sTiCt-gR&86}7T=pjrbuXPG& z>z8l;favVCUrJghuqvYn;gWCDwI?{1C|9;PV!1kFxkGHfL~XxEZ@@@!!B|R^h#pdp9ZrxP zO^|4qkZ75u89=AH;kn4?y2S$*COXwKMb$M&*E>wvL{-^LT-jrC z*=Kg#S7zU2a^rf1=#QD}pQ!Dpuk*#q_~7FC;pG4S|7yY;82|tPgGod|RCwCO$wv}` zP!L7YCW#pgpgj0Q`DFLMJX1NbyBz8n-KtC1ul~O?Kx-i5JG?t76m45Tox>0Gu!=E_ z4y7P&=4bl`c&I!MhnDIY00000NkvXXu0mjfuF;qk literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/sl.png b/projects/igniteui-angular-performance/src/assets/images/flags/sl.png new file mode 100644 index 0000000000000000000000000000000000000000..b68450ddaeaf5d978f86d8827d41097394c99170 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!3HE}t?oSnq^vz%978;gCr`PZ^>uzC1H
~5ca^wrzv>}uAABC@~jvp%jkdiYclL#&}$lXu#W R^+017JYD@<);T3K0RWToE5!f+ literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/sm.png b/projects/igniteui-angular-performance/src/assets/images/flags/sm.png new file mode 100644 index 0000000000000000000000000000000000000000..43f1965025d9c53e034a0f5135c303b83dd0f896 GIT binary patch literal 352 zcmV-m0iXVfP)tOiKk`ikhFxZD!NI*7yqsjGwtEJ7D;_wo-7LxF&V##Tn%F&WVoX7DSb&CgT&QGX zn{{MRezu8Ms{i~=%kY`V&~yjJqGECC!e?T`IR@`UE*lpGWAoH3 zeR(s%%yb<-V`Ww+BbLM}vP`T$!w}P;pEoI|Yeqn5cu=@oW`41MPNhInK0{h1Sti1e yNck4cfOOI57H!`o*7{Qf)e|<6WHf3bRS*Ee8A`~ejMoGJ0000{|l#GjQuSed3&Lf z1KWh(?OlvUzh^MJu$)*>6p@}=(i8WV!Nq}XYVW=Bqk_GLvr^r9<@UHSGu-?k8+0xB RUN6vQ22WQ%mvv4FO#p(jKKB3s literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/so.png b/projects/igniteui-angular-performance/src/assets/images/flags/so.png new file mode 100644 index 0000000000000000000000000000000000000000..819490b9d77e82259eea19979998839160c0cbfe GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!3-qVmezg)QpN#3A+C;{cU`*gx%S-i=)LDR z@qW;h2g&mum#lcU=FEo;=RO{|@#W;*ucz;SyY}qIx1WE1{{Hv>|9|FlneTwwEj?Wv zLnI{c9%N@^P~c(Nm^_X5-_=DA1RW0P&v|^bXL{7cpxN1HrwKf=NOxJXsoe3kWx0yH dLdCuUM!QZ%!Nmt1ZU7Bo@O1TaS?83{1OVvYP8k3I literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/sr.png b/projects/igniteui-angular-performance/src/assets/images/flags/sr.png new file mode 100644 index 0000000000000000000000000000000000000000..9ac433788807de4396674e0917b7d5d5ac68be04 GIT binary patch literal 205 zcmV;;05boHP);JP1Km=p}xj;ecxca89&X4t+|IaZ15s(4oQZqn4&E$s|{b@QsHN*OWCabK_{CN;jhcUIPkK^mR)m00000NkvXX Hu0mjfHvkaN-_3jiUt9`@(k0qUr3mCS8qSig$$mqelF{r G5}E)AGD}1N literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/sv.png b/projects/igniteui-angular-performance/src/assets/images/flags/sv.png new file mode 100644 index 0000000000000000000000000000000000000000..7fe790cb21b704862b153ae720c6cb221418e413 GIT binary patch literal 260 zcmV+f0sH=mP)zZkc_?gb|3$xz5%PJvbQ5qA#z#>WmoBn-2cyZn7b00YVihN;yWosgC zt>ezX%ukyX@%!n?TNhuy<(HKBWvrmYz$Q=IR6bfpjM_A`Yytpd9$5X`f@tpm0000< KMNUMnLSTZ6tayF^ literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/sy.png b/projects/igniteui-angular-performance/src/assets/images/flags/sy.png new file mode 100644 index 0000000000000000000000000000000000000000..c78f9d5ff7a1a755b2cd7a78f674fff56749d220 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!VDxcS|@x5Qd$8%A+A7LW@Vw_#`^H^@Yy#H z9)ES`#H+h!-rPSYsCGZ8;N|y^fB*ga_y6Dj|Nj@QR^1F#ZR6?U7$R{w`Go^3&y{EA zU08X_8y}pBwcvc#-uQE+!9P*ecni))_r>mTt2_RQewzJICBj}P!N84`$ApdH-ixLM Tx92v2oWkJg>gTe~DWM4fu8&1F literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/sz.png b/projects/igniteui-angular-performance/src/assets/images/flags/sz.png new file mode 100644 index 0000000000000000000000000000000000000000..6550515e4aa8de2d10018ef39486a15313054003 GIT binary patch literal 537 zcmV+!0_OdRP)u+bCM)J%AFPYHsV0V&<5yrL9v`RCN6K z@dF1A?A^Qf;>C;mmQ0x8$*w_HsrlzL5ckf0v`taNdD~!2;S|%Hc zIr}t(+J>${Ga88ERcyS1CS_|lL%8dCctXt0fdOJ+Vd3TF1$3{0fdSA^Fm6ZVu*xA{;y1L-exUZuFZY~h5 z=HYFU(VZkDNm}BwGce%b;9z8AjE#+b^6(+~i4Rwn>D16@R9BxTAV6%EpJcIA^p~jEjmC=44$rjF6*2UngG=*9%ldm literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/tg.png b/projects/igniteui-angular-performance/src/assets/images/flags/tg.png new file mode 100644 index 0000000000000000000000000000000000000000..31f1a00ab7ca53b049a0124de5d3a78555f6aafa GIT binary patch literal 233 zcmVplyTu!yRrXTff*Xbbw;f_{*+%_-`R4njn?S}L z=lJUyoU#grF_4X*7660g%klI7e*gIo2LFEi{J8bNWid;tSpY#Fx9o>l@UnLv zT#%X;{Cx2A$L)u|U%vfv>>TwixUS>#cHWvxLS~o6t==u)0wjlKJ{W=)P!fSeMe?Wx j1TCN_0*OJR77#)Jv5Nzc=v&U800000NkvXXu0mjf*EVR0 literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/th.png b/projects/igniteui-angular-performance/src/assets/images/flags/th.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf74c908b9769107855450dd17d2e56c8d3bf41 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&QdXWWjv*e$llQ1A9CVOAU}4hx zZ&Mlb+Ma*^|Nj>-srvcMdyCO5$E9UgUIZ>?SNq6&_KwHlN10o+99S8wU(3C%$k*%z Pn!@1e>gTe~DWM4fr;sQq literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/tj.png b/projects/igniteui-angular-performance/src/assets/images/flags/tj.png new file mode 100644 index 0000000000000000000000000000000000000000..1d83e4c7a25b688d7db981aea6776b0989fe2e5d GIT binary patch literal 283 zcmV+$0p$LPP)b@KO=V#=r!3s~d{-qswI0%wVktx<_O`Xh9LNpJy) z)@$$ku#EvCwy8QfjwJb<@j4E1*HxHX70zjdG`z`k#Uwh8EM>?N2a%_Pmz1&5(`2^N hU9=#xYrq;%w0|-V6`b?Y(A)q3002ovPDHLkV1lVWdF%iH literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/tl.png b/projects/igniteui-angular-performance/src/assets/images/flags/tl.png new file mode 100644 index 0000000000000000000000000000000000000000..c646f33f5ce40eb6791dccc31fcec4f6ad924027 GIT binary patch literal 302 zcmV+}0nz@6P)Nkl?VF4C1}`zV270kM#^_ z02u67mMZ)|u10I?8887b*ymMC0PUu!^$fT`oG0IxeJZrG9$`~PMuwP}7?2??EiEf6 z3uI_2K!cqY)*~#=&d$Dj_wJ-glWyL;$;QTp8SK=x9%?H$H}{k&Q~rZNO-&7+V5gS# zAag}UMd!_%cm4Wxh{c~jfA;Y3pohh9aO>8s{QP_k4Gjke2WDnwdIU8Dbai#XW0!u3 z3kWzkI0hg)4R8T6Fh%A7R1yPIEe=dWV4#{l0F}Z?_l(7{CjbBd07*qoM6N<$f>tkp AfdBvi literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/tm.png b/projects/igniteui-angular-performance/src/assets/images/flags/tm.png new file mode 100644 index 0000000000000000000000000000000000000000..5dd8fb996e4c3506c6a0e5c1b7c44ab3d5a7eeb1 GIT binary patch literal 572 zcmV-C0>k}@P)^51MEs)eZXrv97A``(`em;)dLy`}bN6f3pKG5X4T23D>#gy$& zk8V{*tu3n<8(6JXm{ zVb@m)QIoxLhVS%dl8p}XbC|4SHQn2EZGhn{CzEw5&;SuAiQ>!;0W#R~f==AK$x|3c zj?vS#t)}>xtq;oR*`uYuS=!{V zsV3DDUu>|=0$Ckr5eWxrsTe`&{rWmoGup@7DN|X^Q%8A+r>ni9$Vw$ssu>*>XxlBW zsV^#KB`0UaFS1j^fNDkq)Ae2*U0^70mN5a6N3ArdW^`nr?Q#>t>;TKuFrzwO(_Pwn zR5Loj*P+MV*gnbLBF54=(Qd1*KGlp)46)j!Zm`Z!f02X!Moq&*rdm`pIwsI&o08$S zn&h3`32WV5_Z#R?vrs)WyZG6Gxr@?c->r{ZW9vXQqdmQxch-fzUu1W3Ve`uqi?`XB zQ`6`}##(EP?N<1BY*R7Xr>8?zSF0KvG1ok7rg79l1DLcaG#UVo5$E(l(Y;mx0000< KMNUMnLSTa4-w)9M literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/tn.png b/projects/igniteui-angular-performance/src/assets/images/flags/tn.png new file mode 100644 index 0000000000000000000000000000000000000000..09ce2352debf7bbc604101dc1b4775cae2a58364 GIT binary patch literal 236 zcmV_zV*Qh*4^0CItXlo}0m zAkd(9Ug6JKB|aqP{yKT~*Xi?L`lka03A&wt(LnD5oe5+B&HexX|EH3=|9}7fzIFHK z!J|Maii`#ZE-(;)44`|zui5m1TlNLJ?i0iyvsRj>kcsf4Zo0000 z_iA9^t@QNAy}i$-Pk*&y#rysHe?EQs^ZE0CKY#xJ|9|1L99y79BTpB{5Q)pl73{3S z5)&9E{J$d8{Xp5w=U^;%WY}G2@f?Op&pU*Utdd>rdShJ@^vNhk#x&qYA N;OXk;vd$@?2>_C*K(7D* literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/tr.png b/projects/igniteui-angular-performance/src/assets/images/flags/tr.png new file mode 100644 index 0000000000000000000000000000000000000000..a67740a1450b221cf5a4a8338e8a8c485c5257aa GIT binary patch literal 229 zcmV^P)-aqZGWCU2O=N?$fb_aA8K3v|NZ;#$IlNn&Cm6%o=T{`@(6mH zl0&J{KnDWN{r~6BD>r`>DPF1PMz&7`WuJ&Dl4&&1`~Uy{|1x(GrqZX<8c!wFfC`?< zYQAz0B-vxP~0002nP)t-s00001 z0RaL60tg5Q2?+@b3JMbw6BHB_78VvFA|fRvB_}5*H#avrIyy~FO;Au!R8&-IYHDt7 zZgO&Ri;IhokB^g+ld7t!t*x!Fu&~6$#K*_S$;rvi5hl(OC(jov&loJw7%kBtG|?h8 z(jzw1EXx?3G-rnBga)0A>f#Z3E=#ZM} zl%4A8>g((4?y9oxt+em4xbwrw^Tx~c$g@aL z?fdlf{Pgv?GOT_8007)cL_t(2&uz-ZfkFWk1i{7@cbCE4-QnYqe?*(Wt8=ls#sCP< z_cdA2?3Dx{P&qa2q2VXv0`L`Y9eb$v$a?_Xxo6)VYF|o!0Hl8td#G_71p!Dn3wx-# z*+u|}?$%XvNJ}RUKxllZ+e6cD3IKok+_HxT@2nfZTex@aq3*rl1#oBI1AC}-F8cvU zeW&(N{V)yz5Omvx_&b)c1Zp^|u@l6aw# zd7+Vdp^$r_j(($yexrqU!;>922#U1Cy8tACE=&85v$P@C)4)eXo^TEpV_4)L|%k;y{^u*2d z#?JJ|&-Kd-_sa}ma|Nmm?T`d3r0ZvIoK~#9!g^*`c!axv)FB=RI zj0QA{A|lv(LlV2FD4YQ?8j1xAJqpPG|KcUXh-M(ZH*@>W&9l3=i!xP(r4T|Q#v%!n zOHNmyix4koYdUIx6qiuT3TuX#9RN~;mvfrJN*GIAQZ4F9CeC~P5u%YOiqhq4z176H zQP4_Ji9CQwhi6lOa2NfCeC|c)C&wBT829w&v0;tY(UMkZVBBogUoQT%K7AV6N`=P_ z5K*jBRFj-O46A54nePnakL9-^*j^8-l+^^+UJpsCWo7=SqJ6Es9|Bg=va7Rj9j#`- zBxjg_@V~sNuMpi6bOeHoVb%fm4`zB-v_0R`B=qgRod`70y}^}8WJ!;K$31de{ZSAA zW{1Z{=uvCXG3jIA{C$vE3vj^+@Nf(Mqnk}jaO3W3ZZ#fX2HQMXg7$n2z~j-aH8?mh b0cL#zI>tlerp2($00000NkvXXu0mjf^}T(Z literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/tw.png b/projects/igniteui-angular-performance/src/assets/images/flags/tw.png new file mode 100644 index 0000000000000000000000000000000000000000..88cc0dfc6d7d195dbf0b00ac54878dd6dd72b7b5 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!VDxcS|@x5QU(D&A+8JzGntrXv9iuqRb8R2 zy~@aFt*Pm{q@)8iHK%K9Pd7E4oiypnqD4249)0njf#LuE|G#{ftOn{e^K@|xk+__k z(7>>-T!10P$k2GFVdQ&MBb@0A6uDQ~&?~ literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/tz.png b/projects/igniteui-angular-performance/src/assets/images/flags/tz.png new file mode 100644 index 0000000000000000000000000000000000000000..94ca541a1a929bdab9a0a4800ca8288642e00d47 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!3-qVmezg)QZ@lTA+A80Vewr?Mh3>kcjUHO z$*(*rztu`nn%Q!PS=zSV^ld$v;hdERw09l#+A~Ms&?))%=M_F27yWob^y3AIPtn2q zf!Y&2T^vIyZq=SW$<<&W;(T$BRmj@lumAstI-2M?ZQ3i-6qb7<%X7!_BK!H-$Bdn4 zn)L1A3mZ8lqy!D7LFVdQ&MBb@0FKpHt^fc4 literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ua.png b/projects/igniteui-angular-performance/src/assets/images/flags/ua.png new file mode 100644 index 0000000000000000000000000000000000000000..80301f4610064c2a80e47b86599c7bafdeb2b0e8 GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?$P6SGq{_DgDYgKg5Lc_xBR}toZ8~#y8&E{Z q)5S4_<9c#}g5;n7|NrxQvM@Y+p}xB_DbW}x%i!ti=d#Wzp$PyB@EY0x literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ug.png b/projects/igniteui-angular-performance/src/assets/images/flags/ug.png new file mode 100644 index 0000000000000000000000000000000000000000..fec8a452195a87927fd2b98e3692f0ec3f789cf2 GIT binary patch literal 247 zcmV#N3KBM&AYfr( zxpL_W(6N=3mC-(KbL=&MT%aIz(tdt^{>AebYinv78ye@AVOO&m&&gOZH`rtyf z^cxH69I?fQgE;CTLc}s8AYaw2+e@NMHA7qR#fF3uW7F7fN~u}iznM&#ah*X~mov3& z>R!A0ZrfrR0)uD?t(Ro|r?=DcHf(1ZpC!HG!9<7c=deU2XayFi`Yfjz71QWreB}n%K7I&G z|7f!Vt9sS4^~t;+=AyMv0000P)Dh~CWPShs?f%^x5UGH& z!{*7m$v_~ZfBg9I^XHGQI-ezdx^vrAH_UdL-0uJS)st`Ez5!+B12!{QtRM#gHNSuN zX2I07&GUU0wh8T-E4Z>pa7mB)(pg!rUp)iL&fR>kf5lBQ5Xfj?_yWUWeuwh@g@QM? zh#XxcG`mH1!Iad?7miUOtPky)w4_gK!z7`NllXVf5!^D*Y3_vB&!0X3r8XUYx_s9| zG7!k<*RNmRx^Zq|tM9s5ZgW~>R!&rz-Q)B1%cqwwo>3asKmbe+@87+cKRJHhq~zTj zn{VGZckB8&h?I5O9-!%DAVj(brjy5y?g7IWn680ok(ybC`ni!j&k_|NWJVD&h`fYF xY~rI;Sd*8DiOT3S3~TZVOkxXFn%6Q^2LQ~m_EG=cYWDyD002ovPDHLkV1g@8$Q1wp literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/uz.png b/projects/igniteui-angular-performance/src/assets/images/flags/uz.png new file mode 100644 index 0000000000000000000000000000000000000000..37688d883a7fa8b358912db6623a322a6781e2cd GIT binary patch literal 304 zcmV-00nh%4P)oIu>2H`#&~umf72}(lo`$9I3^7|L=YJ=Ks#eum3x2I`Lm-$zBx2*+;JaXPUL` zfA--k5I&Tqn*&?V-TD9i=db@4z@= zXPv$6e-<#r7{MV44Z$OH4ne2QC;o##?7j=&s8m_LA54n?(|kb~LlgF21gk-(X^Iz>wrwBGnBo5*2cr%g zb>OH22{|yY)ot5g#td>>t^N;YJnFzv2aYL{DE#rjs5!}QJ5|Og5IaI=DpwfF*wcdC zZz+njK~e#Db^{5#hL+J*Ma;`>FgP`vo@IS=B(7n&=kx!oe!y=>TeI$3 S0gA8y0000uu5 literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/vc.png b/projects/igniteui-angular-performance/src/assets/images/flags/vc.png new file mode 100644 index 0000000000000000000000000000000000000000..55018b1437b05d334c7f577064a46d380cd20df1 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!2~2lPfAS&Qd>M-978;gCnsoFwROG{d-`{$ zhMUT&+j(aV^clIOOskGa{QWoQO1{Kz^BLZzi?g@gUSqLJMNdO|+&msdGjek&G|%ef?}#dkax`I(3^~{P{+u_bUJsj+Lh~=ly>;!P0vDI? lR95@_(hWK!u}oE-;o8g;hBtTY0)Xyk@O1TaS?83{1OTaGRp|f# literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/ve.png b/projects/igniteui-angular-performance/src/assets/images/flags/ve.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8b135ab72f5619799515537417d538fbcb1acf GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!3-qVmezg)QceLrA+EDzd>D*Zb6KzBv)dr( zxKY??qqys4d7rIXp*yuhcbdfRamzmBm3P>;@JMvc$+Xt98Et3lXI`DP?%twVUgt%$ zzh4x8f7jtK&@{%9Aiv;;(_eFS06D>)E{-7;x6YpQ`F22WQ%mvv4FO#t&RSCs$& literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/vn.png b/projects/igniteui-angular-performance/src/assets/images/flags/vn.png new file mode 100644 index 0000000000000000000000000000000000000000..e9edf37ff74e8e0c505323b14fdfe6b053cb95eb GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!3-qVmezg)Qpo{6A+F~H)y|8lo)=TQAg*>n zTJ<6j$*NvbQoXFKaz$O`w!7jTU&RM83Xjv}pXAFw&6j)ABlD(L=FJ4@Hxp#uPL_T* zRr=Fv$s7@bv8cHp;jvp{n$sm?c9?^^-rUZ`??BKZlLWqZA$u>S=8DXF z)avKW6L>@Twey}89aAeF=9!$`vU7s!vafrtsZ1!9jJW0~_E6-ZJl~t`Y>nIgU%Cji OkHOQ`&t;ucLK6Vw3vP1& literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/vu.png b/projects/igniteui-angular-performance/src/assets/images/flags/vu.png new file mode 100644 index 0000000000000000000000000000000000000000..b2214473b5e37de6681e08a29514521a49531def GIT binary patch literal 540 zcmV+%0^|LOP)y7aMS8ls3$2cs?>6r@8GMVUwz6xqQ(vAlML@f`Zpz&nyhD?8A7t(c*>UzIkcdt*I_=g4>G&Db z;KUKWW|$r&xdjt(w5Vj(s}IVtoRCF-H}kWkhpDN=7P7}G%X-^`bZ8R5bGUMxZ_juz zNJR`sXeX`MD=(3+qqD_)`^fu}@y9QRLzV!dKEr2O$Z~gpSP8{K@3Z5t*JJ{4!{S5Q z>u5An_4?#>=T3i!rKsJ`SW-Rjgsjn9QdRAzX z^)}^hZmi6wDgWXzTT1?Z=Qt*ZHgS7Dqb)hJGD572)obH_-yo(&TRAtH zR9!x-K1TIz5`bSY4WniZ|E(lZ= eb1tb?h2sZuSqxYMaMM5l00009%!w2d%J<7 zzsZ|PEk&6vrp;)UsZUHHQ%3{Ot|%Uttb>yqISz>xzFoBTsL!)r$+yupT+WKN4^d@rz@y>F&e&lG@&6If- z(qJ>sB;MWh{fn&vlhKR0bH6NJ#w@s&OTf#dKguTS0HIYh5|jAOoPVBMwktk!GckzREc52=H=t@BnI7U1Q5k*Xwp)q@(?~KGWHkQb ti44agjCP{7V-ZGE-LY7Vrj}#j2mpEBtIDSf%hCV<002ovPDHLkV1ht=ft~;W literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/flags/zm.png b/projects/igniteui-angular-performance/src/assets/images/flags/zm.png new file mode 100644 index 0000000000000000000000000000000000000000..a8b574959d2e8592766cd5e39943b8b5e8c1e6c5 GIT binary patch literal 248 zcmV|&r1qCj&ygM2McDalp}j8@KI2(w@)3Sh`gX7DOxC<R z%epxXnSl&-&J0ui7>;K%lsPeETQKCgFhu(@s8ujf9HyNN`gshlaSXLy4B_SsZgvcs zC6tFX5|U|Ruybax38PjtqM=rh52#~wZ3xFM6J8+NV#doV$pAqfK@2DAp@@8=r@C|9 yQxE{6o5}(VFyQ6N@V*v`MvWddderCs*q1t+&+;7r0000li z*W#Xnz>jmMK*7FnVVkT7kV_+k@bT5{sW+F29&+P@`B1)I}g4|Ga+n zk%iXr4F0z}#4j!uxwT64V!P1QaI3!`-a`Uo;lhR7+}sS*1rVcu{rI-OQ}oJGk;V0V z2d4?2o-4e2aU?tzXle1UABQJN%q-)dUn4NPf^S{Bz?Gx3Aq5K!gBk?>{X5^LuzRB5 znfbye=L&7>5q$dS7Htz3)ZVXO-(NWU9tK_<+)Kag1P632KnAkN9GFUCV5-G|X$TBd a(+2>V@&cV0!IM=00000 + + + + IgniteuiAngularPerformance + + + + + + + + diff --git a/projects/igniteui-angular-performance/src/main.ts b/projects/igniteui-angular-performance/src/main.ts new file mode 100644 index 00000000000..35b00f34633 --- /dev/null +++ b/projects/igniteui-angular-performance/src/main.ts @@ -0,0 +1,6 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { AppComponent } from './app/app.component'; + +bootstrapApplication(AppComponent, appConfig) + .catch((err) => console.error(err)); diff --git a/projects/igniteui-angular-performance/src/styles.scss b/projects/igniteui-angular-performance/src/styles.scss new file mode 100644 index 00000000000..f6fc0768f45 --- /dev/null +++ b/projects/igniteui-angular-performance/src/styles.scss @@ -0,0 +1,23 @@ +@use '../../igniteui-angular/src/lib/core/styles/themes' as *; +@import url('https://fonts.googleapis.com/icon?family=Material+Icons'); +@include core(); +@include typography( + $font-family: $material-typeface, + $type-scale: $material-type-scale +); +@include theme($default-palette); + +html, +body { + height: 100%; + width: 100%; +} + +body { + margin: 0; + padding: 0; +} + +* { + box-sizing: border-box; +} diff --git a/projects/igniteui-angular-performance/tsconfig.app.json b/projects/igniteui-angular-performance/tsconfig.app.json new file mode 100644 index 00000000000..742c48812c6 --- /dev/null +++ b/projects/igniteui-angular-performance/tsconfig.app.json @@ -0,0 +1,15 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/app", + "types": [] + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/**/*.spec.ts" + ] +} diff --git a/projects/igniteui-angular-performance/tsconfig.spec.json b/projects/igniteui-angular-performance/tsconfig.spec.json new file mode 100644 index 00000000000..0feea88ed47 --- /dev/null +++ b/projects/igniteui-angular-performance/tsconfig.spec.json @@ -0,0 +1,14 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json index 62e16156d56..58ac0576fa5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -51,5 +51,13 @@ }, "strictInjectionParameters": true, "strictInputAccessModifiers": true, - } + }, + "references": [ + { + "path": "./projects/igniteui-angular-performance/tsconfig.app.json" + }, + { + "path": "./projects/igniteui-angular-performance/tsconfig.spec.json" + } + ] } From 2afc1f68dbfb2b8e4971408099b8d50391cad4c4 Mon Sep 17 00:00:00 2001 From: Martin Dragnev <37667452+mddragnev@users.noreply.github.com> Date: Tue, 29 Jul 2025 17:45:44 +0300 Subject: [PATCH 4/7] perf(sorting): Sorting performance optimizations (#16062) * perf(sorting): Do not check date validity when the column type is different * chore(*): Add workflow dispatch in the pipeline so that the test run * chore(*): remove workflow dispatch * perf(sorting): Improve single sorting algorithm with Schwartizian pre-transform * chore(sample): Randomize the data a bit more * perf(sorting): Change the default multi-sorting algorithm to be iterative --- .../src/app/services/data.service.ts | 6 ++ .../lib/data-operations/sorting-strategy.ts | 39 ++++++--- .../src/lib/grids/common/strategy.ts | 81 ++++++++++--------- 3 files changed, 76 insertions(+), 50 deletions(-) diff --git a/projects/igniteui-angular-performance/src/app/services/data.service.ts b/projects/igniteui-angular-performance/src/app/services/data.service.ts index 696f477df74..b25671cd5a8 100644 --- a/projects/igniteui-angular-performance/src/app/services/data.service.ts +++ b/projects/igniteui-angular-performance/src/app/services/data.service.ts @@ -24,6 +24,7 @@ export class DataService { dataObj["CareerStart"] = this.formatDateTime(this.randomizeDateTime(rnd)); dataObj["Active"] = this.randomizeBoolean(rnd); dataObj["SuccessRate"] = this.randomizePercentage(rnd); + dataObj["AthleteNumber"] = this.randomizeAthleteNumber(dataObj["AthleteNumber"], rnd); currData.push(dataObj); } return currData; @@ -52,6 +53,11 @@ export class DataService { return number >= 5; } + private randomizeAthleteNumber(value: number, rnd: Mulberry32): number { + const number = this.generateRandomNumber(rnd, 0, 100); + return number % 2 ? value + number : value - number; + } + private randomizePercentage(rnd: Mulberry32): number { const value = rnd.random(); // returns value in [0, 1) return Math.floor(value * 1000) / 1000; diff --git a/projects/igniteui-angular/src/lib/data-operations/sorting-strategy.ts b/projects/igniteui-angular/src/lib/data-operations/sorting-strategy.ts index 414c61550ff..695ff191035 100644 --- a/projects/igniteui-angular/src/lib/data-operations/sorting-strategy.ts +++ b/projects/igniteui-angular/src/lib/data-operations/sorting-strategy.ts @@ -54,21 +54,36 @@ export class DefaultSortingStrategy implements ISortingStrategy { ) { const key = fieldName; const reverse = (dir === SortingDirection.Desc ? -1 : 1); - const cmpFunc = (obj1: any, obj2: any) => this.compareObjects(obj1, obj2, key, reverse, ignoreCase, valueResolver, isDate, isTime); - return this.arraySort(data, cmpFunc); + + /** + * Use Schwartizian transform on the data before sorting it so that the sorting value + * is not recomputed on every object compare which improves the number of comparisons from O(nlogn) to O(n) + * where n is the length of the datasource. + * This, on a very large dataset of 1 million records, gives a significant performance boost. + */ + const resolver = valueResolver.bind(this); + const preparedData = data.map(item => { + return { + original: item, + sortValue: this.prepareSortValue(resolver(item, key, isDate, isTime), ignoreCase) + } + }); + const compareFn = (a, b) => reverse * this.compareValues(a.sortValue, b.sortValue); + preparedData.sort(compareFn); + + return preparedData.map(item => item.original); } public compareValues(a: any, b: any): number { - const an = (a === null || a === undefined); - const bn = (b === null || b === undefined); - if (an) { - if (bn) { - return 0; - } - return -1; - } else if (bn) { + const aIsNull = (a === null || a === undefined); + const bIsNull = (b === null || b === undefined); + if (aIsNull) { + return bIsNull ? 0 : -1; + } + if (bIsNull) { return 1; } + return a > b ? 1 : a < b ? -1 : 0; } @@ -94,6 +109,10 @@ export class DefaultSortingStrategy implements ISortingStrategy { protected arraySort(data: any[], compareFn?: (arg0: any, arg1: any) => number): any[] { return data.sort(compareFn); } + + protected prepareSortValue(value: any, ignoreCase: boolean) { + return ignoreCase && typeof value === 'string' ? value.toLocaleLowerCase() : value; + } } export class GroupMemberCountSortingStrategy implements ISortingStrategy { diff --git a/projects/igniteui-angular/src/lib/grids/common/strategy.ts b/projects/igniteui-angular/src/lib/grids/common/strategy.ts index 69912780031..8fe6cba3bd2 100644 --- a/projects/igniteui-angular/src/lib/grids/common/strategy.ts +++ b/projects/igniteui-angular/src/lib/grids/common/strategy.ts @@ -45,6 +45,16 @@ export interface IGridGroupingStrategy extends IGridSortingStrategy { groupBy(data: any[], state: IGroupingState, grid?: any, groupsRecords?: any[], fullResult?: IGroupByResult): IGroupByResult; } +/** + * Represents internal sorting expression that extends the public one. + * Contains boolean properties that represent the type of the column that is being sorted. + */ +interface IGridInternalSortingExpression extends ISortingExpression { + isDate: boolean; + isTime: boolean; + isString: boolean; +} + /** * Represents a class implementing the IGridSortingStrategy interface. * It provides sorting functionality for grid data based on sorting expressions. @@ -59,7 +69,7 @@ export class IgxSorting implements IGridSortingStrategy { * Returns a new array with the data sorted according to the sorting expressions. */ public sort(data: any[], expressions: ISortingExpression[], grid?: GridType): any[] { - return this.sortDataRecursive(data, expressions, 0, grid); + return this.sortData(data, expressions, grid); } /** @@ -147,13 +157,15 @@ export class IgxSorting implements IGridSortingStrategy { */ protected getFieldValue(obj: T, key: string, isDate = false, isTime = false) { let resolvedValue = resolveNestedPath(obj, columnFieldPath(key)); - const date = parseDate(resolvedValue); - if (date && isDate && isTime) { - resolvedValue = date; - } else if (date && isDate && !isTime) { - resolvedValue = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0, 0); - } else if (date && isTime && !isDate) { - resolvedValue = new Date(new Date().setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds())); + if (isDate || isTime) { + const date = parseDate(resolvedValue); + if (date && isDate && isTime) { + resolvedValue = date; + } else if (date && isDate && !isTime) { + resolvedValue = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0, 0); + } else if (date && isTime && !isDate) { + resolvedValue = new Date(new Date().setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds())); + } } return resolvedValue; } @@ -204,48 +216,37 @@ export class IgxSorting implements IGridSortingStrategy { * Returns a new array with the data sorted according to the sorting expressions. * @internal */ - private sortDataRecursive( + private sortData( data: T[], expressions: ISortingExpression[], - expressionIndex = 0, grid: GridType ): T[] { - let i: number; - let j: number; - let gbData: T[]; - let gbDataLen: number; - const exprsLen = expressions.length; - const dataLen = data.length; + const sortingExpressions = this.prepareExpressions(expressions, grid); - expressionIndex = expressionIndex || 0; - if (expressionIndex >= exprsLen || dataLen <= 1) { + if (data.length <= 1) { return data; } - const expr = expressions[expressionIndex]; - if (!expr.strategy) { - expr.strategy = DefaultSortingStrategy.instance() as any; - } - const column = grid?.getColumnByName(expr.fieldName); - const isDate = column?.dataType === DATE_TYPE || column?.dataType === DATE_TIME_TYPE; - const isTime = column?.dataType === TIME_TYPE || column?.dataType === DATE_TIME_TYPE; - const isString = column?.dataType === STRING_TYPE; - data = expr.strategy.sort(data, expr.fieldName, expr.dir, expr.ignoreCase, this.getFieldValue, isDate, isTime, grid); - if (expressionIndex === exprsLen - 1) { - return data; + + for (let i = sortingExpressions.length - 1; i >= 0; i--) { + data = sortingExpressions[i].strategy.sort(data, sortingExpressions[i].fieldName, sortingExpressions[i].dir, sortingExpressions[i].ignoreCase, this.getFieldValue, sortingExpressions[i].isDate, sortingExpressions[i].isTime, grid) } - // in case of multiple sorting - for (i = 0; i < dataLen; i++) { - gbData = this.groupedRecordsByExpression(data, i, expr, isDate, isTime, isString, column?.groupingComparer); - gbDataLen = gbData.length; - if (gbDataLen > 1) { - gbData = this.sortDataRecursive(gbData, expressions, expressionIndex + 1, grid); - } - for (j = 0; j < gbDataLen; j++) { - data[i + j] = gbData[j]; + + return data; + } + + private prepareExpressions(expressions: ISortingExpression[], grid: GridType): IGridInternalSortingExpression[] { + const multipleSortingExpressions: IGridInternalSortingExpression[] = []; + for (const expr of expressions) { + if (!expr.strategy) { + expr.strategy = DefaultSortingStrategy.instance(); } - i += gbDataLen - 1; + const column = grid?.getColumnByName(expr.fieldName); + const isDate = column?.dataType === DATE_TYPE || column?.dataType === DATE_TIME_TYPE; + const isTime = column?.dataType === TIME_TYPE || column?.dataType === DATE_TIME_TYPE; + const isString = column?.dataType === STRING_TYPE; + multipleSortingExpressions.push({ ...expr, isDate, isTime, isString }) } - return data; + return multipleSortingExpressions; } } From 9768aeba1d11d2c3384a67db7a14e54df0bb3b82 Mon Sep 17 00:00:00 2001 From: Radoslav Karaivanov Date: Tue, 29 Jul 2025 18:05:34 +0300 Subject: [PATCH 5/7] refactor: compareValues straightforward comparisons --- .../src/lib/data-operations/sorting-strategy.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/projects/igniteui-angular/src/lib/data-operations/sorting-strategy.ts b/projects/igniteui-angular/src/lib/data-operations/sorting-strategy.ts index 695ff191035..f27392d45f2 100644 --- a/projects/igniteui-angular/src/lib/data-operations/sorting-strategy.ts +++ b/projects/igniteui-angular/src/lib/data-operations/sorting-strategy.ts @@ -75,14 +75,12 @@ export class DefaultSortingStrategy implements ISortingStrategy { } public compareValues(a: any, b: any): number { - const aIsNull = (a === null || a === undefined); - const bIsNull = (b === null || b === undefined); - if (aIsNull) { - return bIsNull ? 0 : -1; - } - if (bIsNull) { - return 1; - } + const aIsNullish = a == null; + const bIsNullish = b == null; + + if (aIsNullish && bIsNullish) return 0; + if (aIsNullish) return -1 + if (bIsNullish) return 1; return a > b ? 1 : a < b ? -1 : 0; } From 3d872728d3448aa3b837226c7fbc8180e0c00418 Mon Sep 17 00:00:00 2001 From: Martin Dragnev <37667452+mddragnev@users.noreply.github.com> Date: Thu, 31 Jul 2025 12:20:55 +0300 Subject: [PATCH 6/7] perf(grouping): Refactor grouping algorithm to be iterative (#16092) * perf(sorting): Do not check date validity when the column type is different * chore(*): Add workflow dispatch in the pipeline so that the test run * chore(*): remove workflow dispatch * perf(sorting): Improve single sorting algorithm with Schwartizian pre-transform * chore(sample): Randomize the data a bit more * perf(sorting): Change the default multi-sorting algorithm to be iterative * perf(grouping): Make grouping algorithm iterative * chore(sample): Add grouping to the sample * chore(*): Remove leftover interfaces --- .../src/app/grid/grid.component.html | 1 + .../src/app/grid/grid.component.ts | 30 +- .../src/lib/grids/common/strategy.ts | 324 +++++++++++------- 3 files changed, 217 insertions(+), 138 deletions(-) diff --git a/projects/igniteui-angular-performance/src/app/grid/grid.component.html b/projects/igniteui-angular-performance/src/app/grid/grid.component.html index 3fd9836d7e4..9cad429ffa8 100644 --- a/projects/igniteui-angular-performance/src/app/grid/grid.component.html +++ b/projects/igniteui-angular-performance/src/app/grid/grid.component.html @@ -13,6 +13,7 @@ [sortable]="col.sortable" [dataType]="col.dataType" [width]="col.width" + [groupable]="col.groupable" > } diff --git a/projects/igniteui-angular-performance/src/app/grid/grid.component.ts b/projects/igniteui-angular-performance/src/app/grid/grid.component.ts index 7a8262d35cb..5a8bf831dc1 100644 --- a/projects/igniteui-angular-performance/src/app/grid/grid.component.ts +++ b/projects/igniteui-angular-performance/src/app/grid/grid.component.ts @@ -1,5 +1,5 @@ -import { Component, inject } from '@angular/core'; -import { GridColumnDataType, IGX_GRID_DIRECTIVES } from "igniteui-angular" +import { Component, inject, ViewChild } from '@angular/core'; +import { GridColumnDataType, IGX_GRID_DIRECTIVES, IgxGridComponent } from "igniteui-angular" import { DataService } from '../services/data.service'; import { ActivatedRoute } from '@angular/router'; @@ -16,22 +16,24 @@ export class GridComponent { private dataService = inject(DataService); private activatedRoute = inject(ActivatedRoute); + @ViewChild(IgxGridComponent, { static: true }) + public grid: IgxGridComponent; constructor() { this.data = this.dataService.generateData(this.activatedRoute.snapshot.data.rows) this.columns = [ - { field: "Id", dataType: GridColumnDataType.Number, sortable: true, width: 'auto' }, - { field: "Name", dataType: GridColumnDataType.String, sortable: true, width: 'auto' }, - { field: "AthleteNumber", dataType: GridColumnDataType.Number, sortable: true, width: 'auto' }, - { field: "Registered", dataType: GridColumnDataType.DateTime, sortable: true, width: 'auto' }, - { field: "CountryName", dataType: GridColumnDataType.String, sortable: true, width: 'auto' }, - { field: "FirstAppearance", dataType: GridColumnDataType.Time, sortable: true, width: 'auto' }, - { field: "CareerStart", dataType: GridColumnDataType.Date, sortable: true, width: 'auto' }, - { field: "Active", dataType: GridColumnDataType.Boolean, sortable: true, width: 'auto' }, - { field: "NetWorth", dataType: GridColumnDataType.Currency, sortable: true, width: 'auto' }, - { field: "CountryFlag", dataType: GridColumnDataType.Image, sortable: true, width: 'auto' }, - { field: "SuccessRate", dataType: GridColumnDataType.Percent, sortable: true, width: 'auto' }, - { field: "Position", dataType: GridColumnDataType.String, sortable: true, width: 'auto' }, + { field: "Id", dataType: GridColumnDataType.Number, sortable: true, width: 'auto', groupable: true }, + { field: "Name", dataType: GridColumnDataType.String, sortable: true, width: 'auto', groupable: true }, + { field: "AthleteNumber", dataType: GridColumnDataType.Number, sortable: true, width: 'auto', groupable: true }, + { field: "Registered", dataType: GridColumnDataType.DateTime, sortable: true, width: 'auto', groupable: true }, + { field: "CountryName", dataType: GridColumnDataType.String, sortable: true, width: 'auto', groupable: true }, + { field: "FirstAppearance", dataType: GridColumnDataType.Time, sortable: true, width: 'auto', groupable: true }, + { field: "CareerStart", dataType: GridColumnDataType.Date, sortable: true, width: 'auto', groupable: true }, + { field: "Active", dataType: GridColumnDataType.Boolean, sortable: true, width: 'auto', groupable: true }, + { field: "NetWorth", dataType: GridColumnDataType.Currency, sortable: true, width: 'auto', groupable: true }, + { field: "CountryFlag", dataType: GridColumnDataType.Image, sortable: true, width: 'auto', groupable: true }, + { field: "SuccessRate", dataType: GridColumnDataType.Percent, sortable: true, width: 'auto', groupable: true }, + { field: "Position", dataType: GridColumnDataType.String, sortable: true, width: 'auto', groupable: true }, ]; } } diff --git a/projects/igniteui-angular/src/lib/grids/common/strategy.ts b/projects/igniteui-angular/src/lib/grids/common/strategy.ts index 8fe6cba3bd2..d951a4d38bc 100644 --- a/projects/igniteui-angular/src/lib/grids/common/strategy.ts +++ b/projects/igniteui-angular/src/lib/grids/common/strategy.ts @@ -48,6 +48,7 @@ export interface IGridGroupingStrategy extends IGridSortingStrategy { /** * Represents internal sorting expression that extends the public one. * Contains boolean properties that represent the type of the column that is being sorted. + * @internal */ interface IGridInternalSortingExpression extends ISortingExpression { isDate: boolean; @@ -55,6 +56,24 @@ interface IGridInternalSortingExpression extends ISortingExpression { isString: boolean; } +/** + * Stack item represents a frame. + * Each frame needs: + * - data: The subset of records to process at this level. + * - level: The current grouping level. + * - parentGroup: The parent IGroupByRecord for groups created in this frame. + * - currentIndex: The index within 'data' to start processing. + * - isExpandingChildren: Flag to indicate if children generated by this group should be added to `result` and `metadata`. + * @internal + */ +interface StackFrame { + data: any[]; + level: number; + parentGroup: IGroupByRecord | null; + currentIndex: number; + isExpandingChildren: boolean; +} + /** * Represents a class implementing the IGridSortingStrategy interface. * It provides sorting functionality for grid data based on sorting expressions. @@ -73,88 +92,13 @@ export class IgxSorting implements IGridSortingStrategy { } /** - * Recursively groups the provided data based on the given grouping state and returns the grouped result. - * Returns an array containing the grouped result. - * @internal - */ - protected groupDataRecursive( - data: any[], - state: IGroupingState, - level: number, - parent: IGroupByRecord, - metadata: IGroupByRecord[], - grid: GridType = null, - groupsRecords: any[] = [], - fullResult: IGroupByResult = { data: [], metadata: [] } - ): IGroupByResult { - const expressions = state.expressions; - const expansion = state.expansion; - let i = 0; - let result = []; - while (i < data.length) { - const column = grid ? grid.getColumnByName(expressions[level].fieldName) : null; - const isDate = column?.dataType === DATE_TYPE || column?.dataType === DATE_TIME_TYPE; - const isTime = column?.dataType === TIME_TYPE || column?.dataType === DATE_TIME_TYPE; - const isString = column?.dataType === STRING_TYPE; - const group = this.groupedRecordsByExpression(data, i, expressions[level], isDate, isTime, isString); - const groupRow: IGroupByRecord = { - expression: expressions[level], - level, - records: cloneArray(group), - value: this.getFieldValue(group[0], expressions[level].fieldName, isDate, isTime), - groupParent: parent, - groups: [], - height: grid ? grid.renderedRowHeight : null, - column - }; - if (parent) { - parent.groups.push(groupRow); - } else { - groupsRecords.push(groupRow); - } - const hierarchy = getHierarchy(groupRow); - const expandState: IGroupByExpandState = expansion.find((s) => - isHierarchyMatch( - s.hierarchy || [{ fieldName: groupRow.expression.fieldName, value: groupRow.value }], - hierarchy, - expressions - )); - const expanded = expandState ? expandState.expanded : state.defaultExpanded; - let recursiveResult; - result.push(groupRow); - metadata.push(null); - fullResult.data.push(groupRow); - fullResult.metadata.push(null); - if (level < expressions.length - 1) { - recursiveResult = this.groupDataRecursive(group, state, level + 1, groupRow, - [], grid, groupsRecords, fullResult); - if (expanded) { - result = result.concat(recursiveResult.data); - metadata = metadata.concat(recursiveResult.metadata); - } - } else { - for (const groupItem of group) { - fullResult.metadata.push(groupRow); - fullResult.data.push(groupItem); - } - if (expanded) { - metadata = metadata.concat(fullResult.metadata.slice(fullResult.metadata.length - group.length)); - result = result.concat(fullResult.data.slice(fullResult.data.length - group.length)); - } - } - i += group.length; - } - return { data: result, metadata }; - } - - /** - * Retrieves the value of the specified field from the given object, considering date and time data types. - * `key`: The key of the field to retrieve. - * `isDate`: (Optional) Indicates if the field is of type Date. - * `isTime`: (Optional) Indicates if the field is of type Time. - * Returns the value of the specified field in the data object. - * @internal - */ + * Retrieves the value of the specified field from the given object, considering date and time data types. + * `key`: The key of the field to retrieve. + * `isDate`: (Optional) Indicates if the field is of type Date. + * `isTime`: (Optional) Indicates if the field is of type Time. + * Returns the value of the specified field in the data object. + * @internal + */ protected getFieldValue(obj: T, key: string, isDate = false, isTime = false) { let resolvedValue = resolveNestedPath(obj, columnFieldPath(key)); if (isDate || isTime) { @@ -170,46 +114,6 @@ export class IgxSorting implements IGridSortingStrategy { return resolvedValue; } - /** - * Groups the records in the provided data array based on the given grouping expression. - * `groupingComparer`: (Optional) A custom grouping comparator to determine the members of the group. - * Returns an array containing the records that belong to the group. - * @internal - */ - private groupedRecordsByExpression( - data: T[], - index: number, - expression: IGroupingExpression, - isDate = false, - isTime = false, - isString: boolean, - groupingComparer?: (a: any, b: any, currRec: any, groupRec: any) => number - ): T[] { - const res = []; - const key = expression.fieldName; - const len = data.length; - const groupRecord = data[index]; - let groupval = this.getFieldValue(groupRecord, key, isDate, isTime); - res.push(groupRecord); - index++; - const comparer = expression.groupingComparer || groupingComparer || DefaultSortingStrategy.instance().compareValues; - for (let i = index; i < len; i++) { - const currRec = data[i]; - let fieldValue = this.getFieldValue(currRec, key, isDate, isTime); - if (expression.ignoreCase && isString) { - // when column's dataType is string but the value is number - fieldValue = fieldValue?.toString().toLowerCase(); - groupval = groupval?.toString().toLowerCase(); - } - if (comparer(fieldValue, groupval, currRec, groupRecord) === 0) { - res.push(currRec); - } else { - break; - } - } - return res; - } - /** * Sorts the provided data array based on the given sorting expressions. * The method can be used when multiple sorting is performed, going through each one @@ -262,14 +166,186 @@ export class IgxGrouping extends IgxSorting implements IGridGroupingStrategy { */ public groupBy(data: any[], state: IGroupingState, grid?: any, groupsRecords?: any[], fullResult: IGroupByResult = { data: [], metadata: [] }): IGroupByResult { - const metadata: IGroupByRecord[] = []; - const grouping = this.groupDataRecursive(data, state, 0, null, metadata, grid, groupsRecords, fullResult); + const grouping = this.groupData(data, state, grid, groupsRecords, fullResult); grid?.groupingPerformedSubject.next(); return { data: grouping.data, metadata: grouping.metadata }; } + + /** + * Groups the provided data based on the given grouping state. + * Changes groupsRecords and fullResult collections by reference. + * Returns an array containing the visible grouped result. + * @internal + */ + protected groupData( + data: any[], + state: IGroupingState, + grid: GridType = null, + groupsRecords: any[] = [], + fullResult: IGroupByResult + ): IGroupByResult { + + const expressions = state.expressions; + const expansion = state.expansion; + + // This holds the final visible data (the rows that are expanded). + const result: any[] = []; + + // This holds the group rows for each record in the result array. Used in grid for information when scrolling. + const metadata: IGroupByRecord[] = []; + + // Initialize the stack with the root level processing. + const initialFrame: StackFrame = { + data: data, + level: 0, + parentGroup: null, + currentIndex: 0, + isExpandingChildren: true + }; + const stack: StackFrame[] = [initialFrame]; + + while (stack.length > 0) { + const currentFrame = stack[stack.length - 1]; // Peek at the top of the stack + + const { data: currentData, level, parentGroup, currentIndex, isExpandingChildren } = currentFrame; + + // If we've processed all data in this frame, pop it. + if (currentIndex >= currentData.length) { + stack.pop(); + continue; + } + + // Process the next group at the current level + const column = grid ? grid.getColumnByName(expressions[level].fieldName) : null; + const isDate = column?.dataType === DATE_TYPE || column?.dataType === DATE_TIME_TYPE; + const isTime = column?.dataType === TIME_TYPE || column?.dataType === DATE_TIME_TYPE; + const isString = column?.dataType === STRING_TYPE; + + // Next block of grouped records for the expression of the current level + const group = this.groupedRecordsByExpression( + currentData, + currentIndex, + expressions[level], + isDate, + isTime, + isString, + column?.groupingComparer + ); + + // Create the group row + const groupRow: IGroupByRecord = { + expression: expressions[level], + level, + records: cloneArray(group), + value: this.getFieldValue(group[0], expressions[level].fieldName, isDate, isTime), + groupParent: parentGroup, + groups: [], + height: grid ? grid.renderedRowHeight : null, + column + }; + + // Link to parent's groups list + if (parentGroup) { + parentGroup.groups.push(groupRow); + } else { + groupsRecords.push(groupRow) + } + + // Determine expansion state for this groupRow + const hierarchy = getHierarchy(groupRow); + const expandState: IGroupByExpandState = expansion.find((s) => + isHierarchyMatch( + s.hierarchy || [{ fieldName: groupRow.expression.fieldName, value: groupRow.value }], + hierarchy, + expressions + ) + ); + const expandedForThisGroup = expandState ? expandState.expanded : state.defaultExpanded; + + // Add the group row to the full result set + fullResult.data.push(groupRow); + fullResult.metadata.push(null); + + // Add the group row to the visible results (if its parent was expanded or it's a root group) + if (isExpandingChildren) { + result.push(groupRow); + metadata.push(null); + } + + // Advance the current frame's index for the next iteration of its loop + currentFrame.currentIndex += group.length; + + if (level < expressions.length - 1) { + // If there are more levels to group, push a new frame onto the stack + const nextFrame: StackFrame = { + data: group, // The records of the current group become the data for the next level + level: level + 1, + parentGroup: groupRow, // The current group row is the parent for the next level + currentIndex: 0, + isExpandingChildren: isExpandingChildren && expandedForThisGroup // Children are expanded only if this group is expanded AND parent is expanded + }; + stack.push(nextFrame); + } else { + // This is the leaf level, add individual items to fullResult and conditionally to result/metadata + for (const groupItem of group) { + fullResult.metadata.push(groupRow); // The metadata for an item is its immediate parent group row. + fullResult.data.push(groupItem); + if (isExpandingChildren && expandedForThisGroup) { + // Add to result and metadata only if expanded + metadata.push(groupRow); + result.push(groupItem); + } + } + } + } + + return { data: result, metadata }; + } + + /** + * Groups the records in the provided data array based on the given grouping expression. + * `groupingComparer`: (Optional) A custom grouping comparator to determine the members of the group. + * Returns an array containing the records that belong to the group. + * @internal + */ + private groupedRecordsByExpression( + data: T[], + index: number, + expression: IGroupingExpression, + isDate = false, + isTime = false, + isString: boolean, + groupingComparer?: (a: any, b: any, currRec: any, groupRec: any) => number + ): T[] { + const res: T[] = []; + const key = expression.fieldName; + const len = data.length; + const groupRecord = data[index]; + let groupValue = this.getFieldValue(groupRecord, key, isDate, isTime); + if (expression.ignoreCase && isString && groupValue) { + // when column's dataType is string but the value is number + groupValue = groupValue.toString().toLowerCase(); + } + res.push(groupRecord); + const comparer = expression.groupingComparer || groupingComparer || DefaultSortingStrategy.instance().compareValues; + for (let i = index + 1; i < len; i++) { + const currRec = data[i]; + let fieldValue = this.getFieldValue(currRec, key, isDate, isTime); + if (expression.ignoreCase && isString && fieldValue) { + // when column's dataType is string but the value is number + fieldValue = fieldValue.toString().toLowerCase(); + } + if (comparer(fieldValue, groupValue, currRec, groupRecord) === 0) { + res.push(currRec); + } else { + break; + } + } + return res; + } } /* csSuppress */ From 2290abed3c163f451e722a4ed4d9175856a1ec05 Mon Sep 17 00:00:00 2001 From: Martin Dragnev <37667452+mddragnev@users.noreply.github.com> Date: Thu, 31 Jul 2025 12:23:09 +0300 Subject: [PATCH 7/7] chore(treegrid): Add performance sample for tree grid (#16101) --- .../src/app/app.component.html | 8 +- .../src/app/app.component.ts | 5 +- .../src/app/app.routes.ts | 27 ++- .../src/app/data/employeesData.ts | 164 ++++++++++++++++++ .../src/app/services/data.service.ts | 37 ++++ .../app/tree-grid/tree-grid.component.html | 23 +++ .../app/tree-grid/tree-grid.component.scss | 16 ++ .../src/app/tree-grid/tree-grid.component.ts | 38 ++++ .../src/assets/images/men/0.jpg | Bin 0 -> 3341 bytes .../src/assets/images/men/1.jpg | Bin 0 -> 3598 bytes .../src/assets/images/men/10.jpg | Bin 0 -> 5422 bytes .../src/assets/images/men/100.jpg | Bin 0 -> 4045 bytes .../src/assets/images/men/11.jpg | Bin 0 -> 5728 bytes .../src/assets/images/men/12.jpg | Bin 0 -> 5610 bytes .../src/assets/images/men/13.jpg | Bin 0 -> 4181 bytes .../src/assets/images/men/14.jpg | Bin 0 -> 6741 bytes .../src/assets/images/men/15.jpg | Bin 0 -> 3805 bytes .../src/assets/images/men/16.jpg | Bin 0 -> 5973 bytes .../src/assets/images/men/17.jpg | Bin 0 -> 3200 bytes .../src/assets/images/men/18.jpg | Bin 0 -> 4344 bytes .../src/assets/images/men/19.jpg | Bin 0 -> 6947 bytes .../src/assets/images/men/2.jpg | Bin 0 -> 4701 bytes .../src/assets/images/men/20.jpg | Bin 0 -> 4726 bytes .../src/assets/images/men/21.jpg | Bin 0 -> 4335 bytes .../src/assets/images/men/22.jpg | Bin 0 -> 4752 bytes .../src/assets/images/men/23.jpg | Bin 0 -> 5615 bytes .../src/assets/images/men/24.jpg | Bin 0 -> 18074 bytes .../src/assets/images/men/25.jpg | Bin 0 -> 4829 bytes .../src/assets/images/men/26.jpg | Bin 0 -> 9975 bytes .../src/assets/images/men/27.jpg | Bin 0 -> 4051 bytes .../src/assets/images/men/28.jpg | Bin 0 -> 5024 bytes .../src/assets/images/men/29.jpg | Bin 0 -> 6516 bytes .../src/assets/images/men/3.jpg | Bin 0 -> 5631 bytes .../src/assets/images/men/30.jpg | Bin 0 -> 4349 bytes .../src/assets/images/men/31.jpg | Bin 0 -> 5616 bytes .../src/assets/images/men/32.jpg | Bin 0 -> 5242 bytes .../src/assets/images/men/33.jpg | Bin 0 -> 5109 bytes .../src/assets/images/men/34.jpg | Bin 0 -> 4305 bytes .../src/assets/images/men/35.jpg | Bin 0 -> 4564 bytes .../src/assets/images/men/36.jpg | Bin 0 -> 4743 bytes .../src/assets/images/men/37.jpg | Bin 0 -> 5084 bytes .../src/assets/images/men/38.jpg | Bin 0 -> 4770 bytes .../src/assets/images/men/39.jpg | Bin 0 -> 4045 bytes .../src/assets/images/men/4.jpg | Bin 0 -> 6336 bytes .../src/assets/images/men/40.jpg | Bin 0 -> 3208 bytes .../src/assets/images/men/41.jpg | Bin 0 -> 4254 bytes .../src/assets/images/men/42.jpg | Bin 0 -> 5004 bytes .../src/assets/images/men/43.jpg | Bin 0 -> 4965 bytes .../src/assets/images/men/44.jpg | Bin 0 -> 5485 bytes .../src/assets/images/men/45.jpg | Bin 0 -> 4597 bytes .../src/assets/images/men/46.jpg | Bin 0 -> 4824 bytes .../src/assets/images/men/47.jpg | Bin 0 -> 4454 bytes .../src/assets/images/men/48.jpg | Bin 0 -> 2843 bytes .../src/assets/images/men/49.jpg | Bin 0 -> 3034 bytes .../src/assets/images/men/5.jpg | Bin 0 -> 3249 bytes .../src/assets/images/men/50.jpg | Bin 0 -> 4881 bytes .../src/assets/images/men/51.jpg | Bin 0 -> 5375 bytes .../src/assets/images/men/52.jpg | Bin 0 -> 4344 bytes .../src/assets/images/men/53.jpg | Bin 0 -> 16867 bytes .../src/assets/images/men/54.jpg | Bin 0 -> 5276 bytes .../src/assets/images/men/55.jpg | Bin 0 -> 5378 bytes .../src/assets/images/men/56.jpg | Bin 0 -> 3733 bytes .../src/assets/images/men/57 (1).jpg | Bin 0 -> 3198 bytes .../src/assets/images/men/57.jpg | Bin 0 -> 5874 bytes .../src/assets/images/men/58.jpg | Bin 0 -> 3747 bytes .../src/assets/images/men/59.jpg | Bin 0 -> 2799 bytes .../src/assets/images/men/6.jpg | Bin 0 -> 4834 bytes .../src/assets/images/men/60.jpg | Bin 0 -> 4563 bytes .../src/assets/images/men/61.jpg | Bin 0 -> 6236 bytes .../src/assets/images/men/62.jpg | Bin 0 -> 5992 bytes .../src/assets/images/men/63.jpg | Bin 0 -> 25892 bytes .../src/assets/images/men/64.jpg | Bin 0 -> 9378 bytes .../src/assets/images/men/65.jpg | Bin 0 -> 3295 bytes .../src/assets/images/men/66.jpg | Bin 0 -> 5936 bytes .../src/assets/images/men/67.jpg | Bin 0 -> 6336 bytes .../src/assets/images/men/68.jpg | Bin 0 -> 3940 bytes .../src/assets/images/men/69.jpg | Bin 0 -> 4611 bytes .../src/assets/images/men/7.jpg | Bin 0 -> 4988 bytes .../src/assets/images/men/70.jpg | Bin 0 -> 4600 bytes .../src/assets/images/men/71.jpg | Bin 0 -> 10528 bytes .../src/assets/images/men/72.jpg | Bin 0 -> 5216 bytes .../src/assets/images/men/73.jpg | Bin 0 -> 4356 bytes .../src/assets/images/men/74.jpg | Bin 0 -> 4256 bytes .../src/assets/images/men/75.jpg | Bin 0 -> 3615 bytes .../src/assets/images/men/76.jpg | Bin 0 -> 6292 bytes .../src/assets/images/men/77.jpg | Bin 0 -> 3705 bytes .../src/assets/images/men/78.jpg | Bin 0 -> 4643 bytes .../src/assets/images/men/79.jpg | Bin 0 -> 4896 bytes .../src/assets/images/men/8.jpg | Bin 0 -> 5352 bytes .../src/assets/images/men/80.jpg | Bin 0 -> 4817 bytes .../src/assets/images/men/81.jpg | Bin 0 -> 4537 bytes .../src/assets/images/men/82.jpg | Bin 0 -> 5081 bytes .../src/assets/images/men/83.jpg | Bin 0 -> 3835 bytes .../src/assets/images/men/84.jpg | Bin 0 -> 4051 bytes .../src/assets/images/men/85.jpg | Bin 0 -> 5488 bytes .../src/assets/images/men/86.jpg | Bin 0 -> 5433 bytes .../src/assets/images/men/87.jpg | Bin 0 -> 5147 bytes .../src/assets/images/men/88.jpg | Bin 0 -> 4922 bytes .../src/assets/images/men/89.jpg | Bin 0 -> 5584 bytes .../src/assets/images/men/9.jpg | Bin 0 -> 2438 bytes .../src/assets/images/men/90.jpg | Bin 0 -> 4610 bytes .../src/assets/images/men/91.jpg | Bin 0 -> 2817 bytes .../src/assets/images/men/92.jpg | Bin 0 -> 4534 bytes .../src/assets/images/men/93.jpg | Bin 0 -> 5615 bytes .../src/assets/images/men/94.jpg | Bin 0 -> 5897 bytes .../src/assets/images/men/95.jpg | Bin 0 -> 4305 bytes .../src/assets/images/men/96.jpg | Bin 0 -> 4564 bytes .../src/assets/images/men/97.jpg | Bin 0 -> 4743 bytes .../src/assets/images/men/98.jpg | Bin 0 -> 5084 bytes .../src/assets/images/men/99.jpg | Bin 0 -> 4770 bytes .../src/assets/images/women/0.jpg | Bin 0 -> 4857 bytes .../src/assets/images/women/1.jpg | Bin 0 -> 3460 bytes .../src/assets/images/women/10.jpg | Bin 0 -> 3935 bytes .../src/assets/images/women/100.jpg | Bin 0 -> 11745 bytes .../src/assets/images/women/11.jpg | Bin 0 -> 6096 bytes .../src/assets/images/women/12.jpg | Bin 0 -> 4067 bytes .../src/assets/images/women/13.jpg | Bin 0 -> 5071 bytes .../src/assets/images/women/14.jpg | Bin 0 -> 4458 bytes .../src/assets/images/women/15.jpg | Bin 0 -> 3805 bytes .../src/assets/images/women/16.jpg | Bin 0 -> 6888 bytes .../src/assets/images/women/17.jpg | Bin 0 -> 3740 bytes .../src/assets/images/women/18.jpg | Bin 0 -> 2881 bytes .../src/assets/images/women/19.jpg | Bin 0 -> 4105 bytes .../src/assets/images/women/2.jpg | Bin 0 -> 5157 bytes .../src/assets/images/women/20.jpg | Bin 0 -> 5900 bytes .../src/assets/images/women/21.jpg | Bin 0 -> 3473 bytes .../src/assets/images/women/22.jpg | Bin 0 -> 6042 bytes .../src/assets/images/women/23.jpg | Bin 0 -> 3614 bytes .../src/assets/images/women/24.jpg | Bin 0 -> 11329 bytes .../src/assets/images/women/25.jpg | Bin 0 -> 6790 bytes .../src/assets/images/women/26.jpg | Bin 0 -> 4680 bytes .../src/assets/images/women/27.jpg | Bin 0 -> 4398 bytes .../src/assets/images/women/28.jpg | Bin 0 -> 5854 bytes .../src/assets/images/women/29.jpg | Bin 0 -> 5445 bytes .../src/assets/images/women/3.jpg | Bin 0 -> 6322 bytes .../src/assets/images/women/30.jpg | Bin 0 -> 4440 bytes .../src/assets/images/women/31.jpg | Bin 0 -> 6380 bytes .../src/assets/images/women/32.jpg | Bin 0 -> 4513 bytes .../src/assets/images/women/33.jpg | Bin 0 -> 5160 bytes .../src/assets/images/women/34.jpg | Bin 0 -> 3374 bytes .../src/assets/images/women/35.jpg | Bin 0 -> 6926 bytes .../src/assets/images/women/36.jpg | Bin 0 -> 5093 bytes .../src/assets/images/women/37.jpg | Bin 0 -> 5554 bytes .../src/assets/images/women/38.jpg | Bin 0 -> 3428 bytes .../src/assets/images/women/39.jpg | Bin 0 -> 5512 bytes .../src/assets/images/women/4.jpg | Bin 0 -> 3218 bytes .../src/assets/images/women/40.jpg | Bin 0 -> 4442 bytes .../src/assets/images/women/41.jpg | Bin 0 -> 6049 bytes .../src/assets/images/women/42.jpg | Bin 0 -> 4646 bytes .../src/assets/images/women/43.jpg | Bin 0 -> 3901 bytes .../src/assets/images/women/44.jpg | Bin 0 -> 3539 bytes .../src/assets/images/women/45.jpg | Bin 0 -> 4515 bytes .../src/assets/images/women/46.jpg | Bin 0 -> 5782 bytes .../src/assets/images/women/47.jpg | Bin 0 -> 11329 bytes .../src/assets/images/women/48.jpg | Bin 0 -> 3767 bytes .../src/assets/images/women/49.jpg | Bin 0 -> 4291 bytes .../src/assets/images/women/5.jpg | Bin 0 -> 2967 bytes .../src/assets/images/women/50.jpg | Bin 0 -> 4492 bytes .../src/assets/images/women/51.jpg | Bin 0 -> 3767 bytes .../src/assets/images/women/52.jpg | Bin 0 -> 3629 bytes .../src/assets/images/women/53.jpg | Bin 0 -> 6361 bytes .../src/assets/images/women/54.jpg | Bin 0 -> 5907 bytes .../src/assets/images/women/55.jpg | Bin 0 -> 5383 bytes .../src/assets/images/women/56.jpg | Bin 0 -> 5160 bytes .../src/assets/images/women/57.jpg | Bin 0 -> 5874 bytes .../src/assets/images/women/58.jpg | Bin 0 -> 4147 bytes .../src/assets/images/women/59.jpg | Bin 0 -> 4416 bytes .../src/assets/images/women/6.jpg | Bin 0 -> 6492 bytes .../src/assets/images/women/60.jpg | Bin 0 -> 4911 bytes .../src/assets/images/women/61.jpg | Bin 0 -> 7113 bytes .../src/assets/images/women/62.jpg | Bin 0 -> 5093 bytes .../src/assets/images/women/63.jpg | Bin 0 -> 6460 bytes .../src/assets/images/women/64.jpg | Bin 0 -> 7522 bytes .../src/assets/images/women/65.jpg | Bin 0 -> 5972 bytes .../src/assets/images/women/66.jpg | Bin 0 -> 4751 bytes .../src/assets/images/women/67.jpg | Bin 0 -> 4071 bytes .../src/assets/images/women/68.jpg | Bin 0 -> 6948 bytes .../src/assets/images/women/69.jpg | Bin 0 -> 5080 bytes .../src/assets/images/women/7.jpg | Bin 0 -> 5469 bytes .../src/assets/images/women/70.jpg | Bin 0 -> 6590 bytes .../src/assets/images/women/71.jpg | Bin 0 -> 6769 bytes .../src/assets/images/women/72.jpg | Bin 0 -> 5314 bytes .../src/assets/images/women/73.jpg | Bin 0 -> 5709 bytes .../src/assets/images/women/74.jpg | Bin 0 -> 11745 bytes .../src/assets/images/women/75.jpg | Bin 0 -> 5836 bytes .../src/assets/images/women/76.jpg | Bin 0 -> 4688 bytes .../src/assets/images/women/77.jpg | Bin 0 -> 4082 bytes .../src/assets/images/women/78.jpg | Bin 0 -> 4675 bytes .../src/assets/images/women/79.jpg | Bin 0 -> 5270 bytes .../src/assets/images/women/8.jpg | Bin 0 -> 5810 bytes .../src/assets/images/women/80.jpg | Bin 0 -> 3702 bytes .../src/assets/images/women/81.jpg | Bin 0 -> 23707 bytes .../src/assets/images/women/82.jpg | Bin 0 -> 6293 bytes .../src/assets/images/women/83.jpg | Bin 0 -> 4771 bytes .../src/assets/images/women/84.jpg | Bin 0 -> 4586 bytes .../src/assets/images/women/85.jpg | Bin 0 -> 3912 bytes .../src/assets/images/women/86.jpg | Bin 0 -> 3321 bytes .../src/assets/images/women/87.jpg | Bin 0 -> 4031 bytes .../src/assets/images/women/88.jpg | Bin 0 -> 3844 bytes .../src/assets/images/women/89.jpg | Bin 0 -> 4440 bytes .../src/assets/images/women/9.jpg | Bin 0 -> 5522 bytes .../src/assets/images/women/90.jpg | Bin 0 -> 4035 bytes .../src/assets/images/women/91.jpg | Bin 0 -> 4859 bytes .../src/assets/images/women/92.jpg | Bin 0 -> 4874 bytes .../src/assets/images/women/93.jpg | Bin 0 -> 4871 bytes .../src/assets/images/women/94.jpg | Bin 0 -> 4542 bytes .../src/assets/images/women/95.jpg | Bin 0 -> 4753 bytes .../src/assets/images/women/96.jpg | Bin 0 -> 6590 bytes .../src/assets/images/women/97.jpg | Bin 0 -> 6769 bytes .../src/assets/images/women/98.jpg | Bin 0 -> 5314 bytes .../src/assets/images/women/99.jpg | Bin 0 -> 5709 bytes 211 files changed, 311 insertions(+), 7 deletions(-) create mode 100644 projects/igniteui-angular-performance/src/app/data/employeesData.ts create mode 100644 projects/igniteui-angular-performance/src/app/tree-grid/tree-grid.component.html create mode 100644 projects/igniteui-angular-performance/src/app/tree-grid/tree-grid.component.scss create mode 100644 projects/igniteui-angular-performance/src/app/tree-grid/tree-grid.component.ts create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/0.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/1.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/10.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/100.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/11.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/12.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/13.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/14.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/15.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/16.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/17.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/18.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/19.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/2.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/20.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/21.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/22.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/23.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/24.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/25.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/26.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/27.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/28.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/29.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/3.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/30.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/31.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/32.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/33.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/34.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/35.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/36.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/37.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/38.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/39.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/4.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/40.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/41.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/42.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/43.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/44.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/45.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/46.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/47.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/48.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/49.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/5.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/50.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/51.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/52.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/53.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/54.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/55.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/56.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/57 (1).jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/57.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/58.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/59.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/6.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/60.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/61.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/62.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/63.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/64.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/65.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/66.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/67.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/68.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/69.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/7.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/70.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/71.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/72.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/73.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/74.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/75.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/76.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/77.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/78.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/79.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/8.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/80.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/81.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/82.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/83.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/84.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/85.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/86.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/87.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/88.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/89.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/9.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/90.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/91.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/92.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/93.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/94.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/95.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/96.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/97.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/98.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/men/99.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/0.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/1.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/10.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/100.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/11.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/12.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/13.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/14.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/15.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/16.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/17.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/18.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/19.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/2.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/20.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/21.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/22.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/23.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/24.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/25.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/26.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/27.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/28.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/29.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/3.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/30.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/31.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/32.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/33.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/34.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/35.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/36.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/37.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/38.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/39.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/4.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/40.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/41.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/42.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/43.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/44.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/45.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/46.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/47.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/48.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/49.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/5.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/50.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/51.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/52.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/53.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/54.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/55.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/56.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/57.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/58.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/59.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/6.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/60.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/61.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/62.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/63.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/64.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/65.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/66.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/67.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/68.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/69.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/7.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/70.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/71.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/72.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/73.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/74.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/75.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/76.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/77.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/78.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/79.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/8.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/80.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/81.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/82.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/83.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/84.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/85.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/86.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/87.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/88.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/89.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/9.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/90.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/91.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/92.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/93.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/94.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/95.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/96.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/97.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/98.jpg create mode 100644 projects/igniteui-angular-performance/src/assets/images/women/99.jpg diff --git a/projects/igniteui-angular-performance/src/app/app.component.html b/projects/igniteui-angular-performance/src/app/app.component.html index 13960a4a92d..8ca8b694e34 100644 --- a/projects/igniteui-angular-performance/src/app/app.component.html +++ b/projects/igniteui-angular-performance/src/app/app.component.html @@ -1,8 +1,10 @@
- - - + @for (route of routes; track $index) { + + }
diff --git a/projects/igniteui-angular-performance/src/app/app.component.ts b/projects/igniteui-angular-performance/src/app/app.component.ts index 079b0d65066..109d49db6d3 100644 --- a/projects/igniteui-angular-performance/src/app/app.component.ts +++ b/projects/igniteui-angular-performance/src/app/app.component.ts @@ -1,6 +1,7 @@ import { Component } from '@angular/core'; -import { RouterLink, RouterOutlet } from '@angular/router'; +import { RouterLink, RouterOutlet, Routes } from '@angular/router'; import { IgxButtonDirective } from 'igniteui-angular'; +import { routes } from './app.routes'; @Component({ selector: 'app-root', @@ -9,5 +10,5 @@ import { IgxButtonDirective } from 'igniteui-angular'; styleUrl: './app.component.scss' }) export class AppComponent { - + protected routes: Routes = routes; } diff --git a/projects/igniteui-angular-performance/src/app/app.routes.ts b/projects/igniteui-angular-performance/src/app/app.routes.ts index 901abff8c93..f954675b9e4 100644 --- a/projects/igniteui-angular-performance/src/app/app.routes.ts +++ b/projects/igniteui-angular-performance/src/app/app.routes.ts @@ -1,21 +1,44 @@ import { Routes } from '@angular/router'; import { GridComponent } from './grid/grid.component'; +import { TreeGridComponent } from './tree-grid/tree-grid.component'; export const routes: Routes = [ { - path: "grid-100k", - component: GridComponent, + path: "tree-grid-1m", + title: "Tree Grid 1M records", + component: TreeGridComponent, + data: { rows: 1_000_000 } + }, + { + path: "tree-grid-100k", + title: "Tree Grid 100k records", + component: TreeGridComponent, data: { rows: 100_000 } }, + { + path: "tree-grid", + title: "Tree Grid 1k records", + component: TreeGridComponent, + data: { rows: 1000 } + }, { path: "grid-1m", + title: "Grid 1M records", component: GridComponent, data: { rows: 1_000_000 } }, + { + path: "grid-100k", + title: "Grid 100k records", + component: GridComponent, + data: { rows: 100_000 } + }, { path: "", + title: "Grid 1k records", pathMatch: 'full', component: GridComponent, data: { rows: 1000 } } + ]; diff --git a/projects/igniteui-angular-performance/src/app/data/employeesData.ts b/projects/igniteui-angular-performance/src/app/data/employeesData.ts new file mode 100644 index 00000000000..eb9c587ea2f --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/data/employeesData.ts @@ -0,0 +1,164 @@ +export const EMPLOYEES_DATA = [ + { + Age: 55, + Avatar: 'assets/images/men/5.jpg', + HireDate: new Date(2008, 3, 20), + ID: 1, + Name: 'Johnathan Winchester', + ParentID: -1, + Title: 'Development Manager' + }, + { + Age: 42, + Avatar: 'assets/images/women/4.jpg', + HireDate: new Date(2014, 1, 22), + ID: 4, + Name: 'Ana Sanders', + ParentID: -1, + Title: 'CEO' + }, + { + Age: 49, + Avatar: 'assets/images/women/2.jpg', + HireDate: new Date(2014, 1, 22), + ID: 18, + Name: 'Victoria Lincoln', + ParentID: -1, + Title: 'Accounting Manager' + }, + { + Age: 61, + Avatar: 'assets/images/men/4.jpg', + HireDate: new Date(2010, 1, 1), + ID: 10, + Name: 'Yang Wang', + ParentID: -1, + Title: 'Localization Manager' + }, + { + Age: 43, + Avatar: 'assets/images/men/1.jpg', + HireDate: new Date(2011, 6, 3), + ID: 3, + Name: 'Michael Burke', + ParentID: 1, + Title: 'Senior Software Developer' + }, + { + Age: 29, + Avatar: 'assets/images/men/2.jpg', + HireDate: new Date(2009, 6, 19), + ID: 2, + Name: 'Thomas Anderson', + ParentID: 1, + Title: 'Senior Software Developer' + }, + { + Age: 31, + Avatar: 'assets/images/women/3.jpg', + HireDate: new Date(2014, 8, 18), + ID: 11, + Name: 'Monica Reyes', + ParentID: 1, + Title: 'Software Development Team Lead' + }, + { + Age: 35, + Avatar: 'assets/images/men/3.jpg', + HireDate: new Date(2015, 9, 17), + ID: 6, + Name: 'Roland Mendel', + ParentID: 11, + Title: 'Senior Software Developer' + }, + { + Age: 44, + Avatar: 'assets/images/men/6.jpg', + HireDate: new Date(2009, 10, 11), + ID: 12, + Name: 'Sven Cooper', + ParentID: 11, + Title: 'Senior Software Developer' + }, + { + Age: 44, + Avatar: 'assets/images/men/7.jpg', + HireDate: new Date(2014, 4, 4), + ID: 14, + Name: 'Laurence Johnson', + ParentID: 4, + Title: 'Director' + }, + { + Age: 25, + Avatar: 'assets/images/women/1.jpg', + HireDate: new Date(2017, 11, 9), + ID: 5, + Name: 'Elizabeth Richards', + ParentID: 4, + Title: 'Vice President' + }, + { + Age: 39, + Avatar: 'assets/images/men/8.jpg', + HireDate: new Date(2010, 3, 22), + ID: 13, + Name: 'Trevor Ashworth', + ParentID: 5, + Title: 'Director' + }, + { + Age: 44, + Avatar: 'assets/images/men/9.jpg', + HireDate: new Date(2014, 4, 4), + ID: 17, + Name: 'Antonio Moreno', + ParentID: 18, + Title: 'Senior Accountant' + }, + { + Age: 50, + Avatar: 'assets/images/men/10.jpg', + HireDate: new Date(2007, 11, 18), + ID: 7, + Name: 'Pedro Rodriguez', + ParentID: 10, + Title: 'Senior Localization Developer' + }, + { + Age: 27, + Avatar: 'assets/images/women/5.jpg', + HireDate: new Date(2016, 2, 19), + ID: 8, + Name: 'Casey Harper', + ParentID: 10, + Title: 'Senior Localization Developer' + }, + { + Age: 25, + Avatar: 'assets/images/women/6.jpg', + HireDate: new Date(2017, 11, 9), + ID: 15, + Name: 'Patricia Simpson', + ParentID: 7, + Title: 'Localization Intern' + }, + { + Age: 39, + Avatar: 'assets/images/men/26.jpg', + HireDate: new Date(2010, 3, 22), + ID: 9, + Name: 'Francisco Chang', + ParentID: 7, + Title: 'Localization Intern' + }, + { + Age: 25, + Avatar: 'assets/images/men/27.jpg', + HireDate: new Date(2018, 3, 18), + ID: 16, + Name: 'Peter Lewis', + ParentID: 7, + Title: 'Localization Intern' + } +]; diff --git a/projects/igniteui-angular-performance/src/app/services/data.service.ts b/projects/igniteui-angular-performance/src/app/services/data.service.ts index b25671cd5a8..001f33beb4a 100644 --- a/projects/igniteui-angular-performance/src/app/services/data.service.ts +++ b/projects/igniteui-angular-performance/src/app/services/data.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { Mulberry32 } from '../lib/mulberry'; import { DATA as athletesData } from "../data/athletesData" +import { EMPLOYEES_DATA } from '../data/employeesData'; @Injectable({ @@ -14,6 +15,38 @@ export class DataService { return data; } + public generateTreeData(rows: number): any[] { + const rnd = new Mulberry32(1234); + const data = this.generateEmployeesData(rnd, rows); + return data; + } + + private generateEmployeesData(rnd: Mulberry32, rows: number): any[] { + const currData = []; + let uniqueId = 1; + const parentCandidates: number[] = []; + for (let i = 0; i < rows; i++) { + const rand = Math.floor(rnd.random() * Math.floor(EMPLOYEES_DATA.length)); + const dataObj = Object.assign({}, EMPLOYEES_DATA[rand]); + dataObj.ID = uniqueId++; + if (currData.length > 0 && rnd.random() > 0.2) { + const parentIndex = Math.floor(rnd.random() * parentCandidates.length); + dataObj.ParentID = parentCandidates[parentIndex]; + } else { + dataObj.ParentID = -1; // Root node + } + dataObj["CheckedIn"] = this.formatDateTime(this.randomizeDateTime(rnd)); + dataObj["CareerStart"] = this.formatDateTime(this.randomizeDateTime(rnd)); + dataObj["GrossSalary"] = this.randomizeSalary(rnd); + dataObj["PTO"] = this.randomizeBoolean(rnd); + dataObj["SuccessRate"] = this.randomizePercentage(rnd); + parentCandidates.push(dataObj.ID); + + currData.push(dataObj); + } + return currData; + } + private generateAthletesData(rnd: Mulberry32, rows: number): any[] { const currData = []; for (let i = 0; i < rows; i++) { @@ -63,6 +96,10 @@ export class DataService { return Math.floor(value * 1000) / 1000; } + private randomizeSalary(rnd: Mulberry32): number { + return this.generateRandomNumber(rnd, 80_000, 100_000); + } + private formatDateTime(date: Date) { // Format: MM/DD/YYYY HH:mm:ss const formatted = `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()} ` + diff --git a/projects/igniteui-angular-performance/src/app/tree-grid/tree-grid.component.html b/projects/igniteui-angular-performance/src/app/tree-grid/tree-grid.component.html new file mode 100644 index 00000000000..a516762a6e2 --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/tree-grid/tree-grid.component.html @@ -0,0 +1,23 @@ +
+ + @for (col of columns; track col) { + + + } + +
diff --git a/projects/igniteui-angular-performance/src/app/tree-grid/tree-grid.component.scss b/projects/igniteui-angular-performance/src/app/tree-grid/tree-grid.component.scss new file mode 100644 index 00000000000..eabcf19790a --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/tree-grid/tree-grid.component.scss @@ -0,0 +1,16 @@ +:host { + display: flex; + flex-direction: column; + height: 100%; +} + +.grid-wrapper { + height: 100%; + width: 100%; +} + +::ng-deep { + img { + width: 60px !important; + } +} diff --git a/projects/igniteui-angular-performance/src/app/tree-grid/tree-grid.component.ts b/projects/igniteui-angular-performance/src/app/tree-grid/tree-grid.component.ts new file mode 100644 index 00000000000..2f274c23ade --- /dev/null +++ b/projects/igniteui-angular-performance/src/app/tree-grid/tree-grid.component.ts @@ -0,0 +1,38 @@ +import { Component, inject, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { GridColumnDataType, IgxColumnComponent, IgxTreeGridComponent } from 'igniteui-angular'; +import { DataService } from '../services/data.service'; + +@Component({ + selector: 'app-tree-grid', + imports: [IgxTreeGridComponent, IgxColumnComponent], + templateUrl: './tree-grid.component.html', + styleUrl: './tree-grid.component.scss' +}) +export class TreeGridComponent { + protected columns: any[] = [] + protected data: any[] = []; + protected performanceDataList: PerformanceEntryList = []; + private dataService = inject(DataService); + private activatedRoute = inject(ActivatedRoute); + + @ViewChild(IgxTreeGridComponent, { static: true }) + public grid: IgxTreeGridComponent; + + constructor() { + this.data = this.dataService.generateTreeData(this.activatedRoute.snapshot.data.rows) + this.columns = [ + { field: "ID", dataType: GridColumnDataType.Number, sortable: true, width: 'auto', groupable: true }, + { field: "Name", dataType: GridColumnDataType.String, sortable: true, width: 'auto', groupable: true }, + { field: "Age", dataType: GridColumnDataType.Number, sortable: true, width: 'auto', groupable: true }, + { field: "HireDate", dataType: GridColumnDataType.Date, sortable: true, width: 'auto', groupable: true }, + { field: "Title", dataType: GridColumnDataType.String, sortable: true, width: 'auto', groupable: true }, + { field: "CheckedIn", dataType: GridColumnDataType.Time, sortable: true, width: 'auto', groupable: true }, + { field: "PTO", dataType: GridColumnDataType.Boolean, sortable: true, width: 'auto', groupable: true }, + { field: "GrossSalary", dataType: GridColumnDataType.Currency, sortable: true, width: 'auto', groupable: true }, + { field: "Avatar", dataType: GridColumnDataType.Image, sortable: true, width: 'auto', groupable: true }, + { field: "CareerStart", dataType: GridColumnDataType.DateTime, sortable: true, width: 'auto', groupable: true }, + { field: "SuccessRate", dataType: GridColumnDataType.Percent, sortable: true, width: 'auto', groupable: true }, + ]; + } +} diff --git a/projects/igniteui-angular-performance/src/assets/images/men/0.jpg b/projects/igniteui-angular-performance/src/assets/images/men/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e29aaafb904d8e5e8e94bcb9e7e11b327dd53adb GIT binary patch literal 3341 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 ICNL)c1sZum2mk;8 literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/men/1.jpg b/projects/igniteui-angular-performance/src/assets/images/men/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8004cc4111940f6af43cdc36409a1733da659544 GIT binary patch literal 3598 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 Ln0@Uk?cKisIeD%( literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/men/10.jpg b/projects/igniteui-angular-performance/src/assets/images/men/10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a9edd8d12b9ee6319f0c80bb28ebbc3b742b118 GIT binary patch literal 5422 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 literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/men/100.jpg b/projects/igniteui-angular-performance/src/assets/images/men/100.jpg new file mode 100644 index 0000000000000000000000000000000000000000..26f9951ab60a0eeeda411aa8faecae173162bf6c GIT binary patch literal 4045 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 Y*^#VU*L^0Jma=AZ8u0OpMC`Z!0zH7!Jpcdz literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/men/12.jpg b/projects/igniteui-angular-performance/src/assets/images/men/12.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b83a77397c4219e5b96e892e74701c2fd8c6e7e7 GIT binary patch literal 5610 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 Dn}W$K literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/men/13.jpg b/projects/igniteui-angular-performance/src/assets/images/men/13.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43269e04549dfca78dea568f01dcd8723fcce0ee GIT binary patch literal 4181 zcmbtWXH-*Lx7{faT13i)h(PEF2vRQ{q!UzvG!d{sXi-`M(y@SoQiIZq!lj8)M7mO? zs3=X44oVj(0*W9dc?W%C+&|y<T=}sD#DY)5-$!yuU9WU=ECcE)W2Y;2IzTci;=8A@2$G>_6wp|IRZ7UQiAJ zn!Q0FAVV3hzzxbh4n?m4AK(mm7bxxw4R>e-WCy)J@BsYVQy&+F13jo@783yIW@xnU zk^rDG0N9VD(RTl#(e`rzKnw%WocM3PS0dETRVYsRHztw=0Bbk^)s6qg9PmLu#Otekv2SbjbpUS0ta8F2xj`KwfrS)9+uN5qGw_0_Z4|IT5)j1(v_b3oSciYWn-Wy_n8_#+~JH!iSx;%d~`eZ{PN@e`f$}*$xmcO!E#5FNRvZUR4W2GL>1s@?kaUI8%Z{uMH*KvIPaoY+?aQ=I0_?Q2#{!B$$t#b?4ir~QQ^6^riXBv?uqOCLjiDD@#lmN3;e3H$` zClhzinOFz!;m%4|>DZr>Pu*o~)hQN+1qsI1_Tf#huRNJBHyD?dFw7{+U3%;ke((K# zL&9bJ?RZ;sGY!OjO1=JLVz*12JFDD4u#tG}-yU!2H~8O6)kVCHY^rWYZ}4irO%!jvfE+{rl z_It^K%POG(mzS(0Z;Vif#q5MgDoc0cv%4+_OlLQ=ID9r&lN{48;8VfaU#~3VEH}^Oo*}b_9jXv3we98=wwT@Q4$SdxWf$79+)@XBQ#)z(`HG6 zr9MWb@lpdy+kIMAWQXJ76(Of0=uoa{v0R!vlons6T{RTF!N$t|899DM!NHnRD`wQ{Py1}t{xF5XbfKXXB=%d)bhy>_3f zwRd}lE84lk`JRaDg>IYK*sm`ZG~e#EZWWfUPHy-;w6c(xZ+5(2tNm6xH55%`#)(O# zxGYp;i?{?tQaIZq<5qEaQDiS;+wzV48&{NyR*S_SJPj})%EYcUeYM-J+2;6J6sl$E z=E?U7he$E8P&7Uyf<>GoS^D%7+N<{&^9}kRMjLkPY-96`zW?CZj_lKtTZZMz#X^XLT1$&RZ`)7>$ybsu@` ziu!r3vCJe{Ttw^5SnlBhUfp9KoH~i_s_t3(kXCW3ait;K>DWk%__>}W`bOQk{YpYG z-b*wwd1D(NQmB<$yjXWbv;^xe;$K^>mj$zlkGrZg@pUQ6i`QR-{CwQ0*QS8T8%E!n zA57ZPp41MKZclht&&EBJh|VNrG0m*rs1HTs3_5&Uj(EmKKd3BOs8Uc4>zEYmsy9qV zm`ldD{TM3?ZR3(#EkJeVF1v774RxJ(SFYl*JLoJD#%kiZ(e7SQ&GbHaI6TW{_`_g& zUgj;y9QALv9_eINoLQ$&X{tK!$z{z3%M*Km`I5J(QY5jPXyBMUID*_tE_r#k2hnhS zMG0Q3W@up15n>Wb{4uS3dcXOe? z&Brp`rM!k)F;i#()nwH-4snr4p6umum?!dij+}-(OVKQ8Fm`0A)vNvDF-)<-b&h#h zyGK&T*)jg!Qq-~TxxN9;UEe?_rjYerGY@{Thc>O~vzb0mFsrMSnX>|$+4j$2NA2ui z7%LP@Z1t2#CJdTe5*1HWE1rp1>dyB)E8L6fEGia{!kmBT@=auX$$havgjF(9-d%O4 z*G)QCbCiNks!4TZ?JP&ETdz`e-MKBJAFfZFTA9+QDONLC5@vW+J-gARQ1Cu|%9p%J z+7h!NWzqmgwDykgj@7lEaqN4oh^%Sy8F6;1Pw^dLhSH}uEzQqiN&7Qju6)RNE2_Lf zz%0joLP|$C$2>G6p3lLmN@*DAD8ePr5W+j@~`(X8n(AS1zle=ff&V(IRTMo&k4 z%QqvI89(mb>CtIbe2Wdoj{+{vjFbfb``c??aLk-r9_B;)dAn5Md^UHF)_}{A;tB1Z z>Q{%~sw4;W(DBSsP|0*OP~#OCO6o7`s0&FkZ}Tm8mh{#c4#&MadV0yR>xh)geJK)q z=I!mzW=xtbT+f{IQn%c)zl&d%d@{MeAf_l%qcbpsUygK&XO1B~Jg(Rsbx{SsPv9LJ z;#0FC&<~U6VyrUFsq>Q??P549)V0Ew;v(|PI{bluWiT+H)OUESgA2JIbYbfhDv}oK z#J7st1GyMNiZ%;L4rVi-=Vsr1RS!+!H5ILCG)^o(%e45mn@&`FoCdsiczmMp=$^wk z!6Z>VCYGF@Gwq^U`oiC-AMG=&@m@NwJ$b`BtPWpO&3)CdGKjCkWD97~0A*~(KsAny zY4_VpD@?btebXoGGB2qtRG5D`j7m6QR_hHY@1=o+v25_LWcdk;$(N zbqltRS~7beRsyLY83T(tl9gtm{HzxX!R}1+%H(r;T&hA8=G9MQj)lcectRX@up4=Rr;JtXBOI2 z+s^^R_WVZfmO^AhR;9J{ZJ!*8eqSS_OB)i&LJ|0SNtyKIM)9P8_qzA#LnV>xN0M%K z7t_GG-G9my7Il%lY_;n1_cF}{eMaI=>~U0SoVe%8>_v`&?tiB8wpf#yU;3iZ6f34B zFd|7SgLhwQH-dk%LnAY-rSZznDZVbTmKTRW! zWK=kh=CG;6t(3k0{#f<^mo2!a)CY%#W<44i90mda*m| hY}mHmXJ$4T$GY~7l$2C1hul?E9F>*yJ$r;U@;_6-?~woi literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/men/14.jpg b/projects/igniteui-angular-performance/src/assets/images/men/14.jpg new file mode 100644 index 0000000000000000000000000000000000000000..606b1a6f7930f9a4c5490641545c75705592126e GIT binary patch literal 6741 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 Bg24a) literal 0 HcmV?d00001 diff --git a/projects/igniteui-angular-performance/src/assets/images/men/15.jpg b/projects/igniteui-angular-performance/src/assets/images/men/15.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2818c5dda062780bb63c9c98c292b563bd55ceb3 GIT binary patch literal 3805 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