@deriv-com/smartcharts-champion 1.9.5 → 1.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -24,10 +24,6 @@ inputs:
24
24
  description: "Flutter version"
25
25
  required: false
26
26
  default: "3.24.1"
27
- flutter_web_renderer:
28
- description: "Flutter web renderer"
29
- required: false
30
- default: "html"
31
27
  environment:
32
28
  description: "Deployment environment (production/preview)"
33
29
  required: false
@@ -58,12 +54,10 @@ runs:
58
54
 
59
55
  - name: Build Flutter chart component
60
56
  shell: bash
61
- env:
62
- FLUTTER_WEB_RENDERER: ${{ inputs.flutter_web_renderer }}
63
57
  run: |
64
58
  cd chart_app
65
59
  flutter pub get
66
- flutter build web --web-renderer "$FLUTTER_WEB_RENDERER" --release
60
+ flutter build web --wasm --release
67
61
  cd ..
68
62
 
69
63
  - name: Build application
@@ -0,0 +1,47 @@
1
+ name: DocSync AI - Documentation Sync
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "30 6 * * 5" # 10:30 AM GST (6:30 AM UTC) every Friday
6
+
7
+ issue_comment:
8
+ types: [created]
9
+
10
+ jobs:
11
+ docsync-scheduled:
12
+ if: github.event_name == 'schedule'
13
+ permissions:
14
+ contents: write
15
+ pull-requests: write
16
+ issues: write
17
+ uses: deriv-com/shared-actions/.github/workflows/docsync-ai.yml@master
18
+ with:
19
+ trigger_type: "scheduled"
20
+ base_branch: "master"
21
+ secrets:
22
+ DOCSYNC_GITHUB_TOKEN: ${{ secrets.DOCSYNC_GITHUB_TOKEN }}
23
+ DOCSYNC_ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
24
+ DOCSYNC_SLACK_TOKEN: ${{ secrets.DOCSYNC_SLACK_TOKEN }}
25
+ DOCSYNC_SLACK_CHANNEL_ID: ${{ secrets.DOCSYNC_SLACK_CHANNEL_ID }}
26
+ DOCSYNC_SLACK_MENTION_USER_IDS: ${{ secrets.DOCSYNC_SLACK_MENTION_USER_IDS }}
27
+ docsync-comment:
28
+ if: |
29
+ github.event_name == 'issue_comment' &&
30
+ github.event.issue.pull_request &&
31
+ startsWith(github.event.comment.body, '@docbot')
32
+ permissions:
33
+ contents: write
34
+ pull-requests: write
35
+ uses: deriv-com/shared-actions/.github/workflows/docsync-ai.yml@master
36
+ with:
37
+ trigger_type: "comment"
38
+ comment_body: ${{ github.event.comment.body }}
39
+ comment_pr_number: ${{ github.event.issue.number }}
40
+ comment_id: ${{ github.event.comment.id }}
41
+ base_branch: "master"
42
+ secrets:
43
+ DOCSYNC_GITHUB_TOKEN: ${{ secrets.DOCSYNC_GITHUB_TOKEN }}
44
+ DOCSYNC_ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
45
+ DOCSYNC_SLACK_TOKEN: ${{ secrets.DOCSYNC_SLACK_TOKEN }}
46
+ DOCSYNC_SLACK_CHANNEL_ID: ${{ secrets.DOCSYNC_SLACK_CHANNEL_ID }}
47
+ DOCSYNC_SLACK_MENTION_USER_IDS: ${{ secrets.DOCSYNC_SLACK_MENTION_USER_IDS }}
@@ -1,71 +1,19 @@
1
- # Claude Code Assistant Workflow
2
- # This GitHub Actions workflow uses the Claude Code Action to review pull requests.
3
- name: Claude Code Assistant
1
+ name: Claude PR Review
4
2
 
5
3
  on:
6
- pull_request:
7
- types: [opened, synchronize, reopened, ready_for_review]
4
+ pull_request_target:
5
+ types: [opened, synchronize, reopened, ready_for_review]
8
6
 
9
7
  jobs:
10
- claude-assistant:
11
- # Only run on PR-related events that contain @claude
12
- if: github.event_name == 'pull_request'
13
- runs-on: ubuntu-latest
14
-
15
- permissions:
16
- contents: read
17
- pull-requests: write
18
- issues: write
19
- id-token: write
20
- actions: read
21
-
22
- # Cancel older runs when new commits arrive on the same PR
23
- concurrency:
24
- group: pr-${{ github.event.pull_request.number }}
25
- cancel-in-progress: true
26
-
27
- steps:
28
- - name: Verify user
29
- uses: 'deriv-com/shared-actions/.github/actions/verify_user_in_organization@v3'
30
- with:
31
- username: ${{ github.event.pull_request.user.login }}
32
- token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
33
-
34
- # Ensure we have a real git repo at the PR HEAD (works for forks)
35
- - name: Checkout PR head
36
- uses: actions/checkout@v4
37
- with:
38
- repository: ${{ github.event.pull_request.head.repo.full_name }}
39
- ref: ${{ github.event.pull_request.head.ref }}
40
- fetch-depth: 20
41
- token: ${{ secrets.GITHUB_TOKEN }}
42
-
43
- # Sanity check (helps diagnose if anything goes wrong)
44
- - name: Verify git workspace
45
- run: |
46
- pwd
47
- git rev-parse --is-inside-work-tree
48
- git log -1 --oneline
49
-
50
- - name: Run Claude Code Action
51
- uses: anthropics/claude-code-action@v1
52
- timeout-minutes: 60
53
- with:
54
- github_token: ${{ secrets.GITHUB_TOKEN }}
55
- anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
56
- track_progress: true
57
- prompt: |
58
- REPO: ${{ github.repository }}
59
- PR NUMBER: ${{ github.event.pull_request.number }}
60
-
61
- Please review this pull request with a focus on:
62
- - Correctness, regressions, and edge cases
63
- - Code quality & readability (React + TypeScript best practices)
64
- - Performance (render cost, memoization, effects)
65
- - Security (XSS, auth flows, secrets)
66
- - Tests (coverage for new logic)
67
-
68
- Output:
69
- - Inline comments for specific issues
70
- - A summary comment with high/medium/low priority items
71
- - Concrete fix suggestions and quick patches where safe
8
+ claude-review:
9
+ uses: deriv-com/shared-actions/.github/workflows/claude-pr-review.yml@master
10
+ permissions:
11
+ contents: read
12
+ pull-requests: write
13
+ issues: write
14
+ id-token: write
15
+ actions: write
16
+ secrets:
17
+ ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
18
+ AGENT_METRICS_API_URL: ${{ secrets.AGENT_METRICS_API_URL }}
19
+ AGENT_METRICS_API_KEY: ${{ secrets.AGENT_METRICS_API_KEY }}
@@ -98,7 +98,7 @@ jobs:
98
98
  run: |
99
99
  cd smartcharts-champion/chart_app
100
100
  flutter pub get
101
- flutter build web --web-renderer html --release
101
+ flutter build web --wasm --release
102
102
 
103
103
  - name: Setup Node
104
104
  uses: actions/setup-node@v4
@@ -16,7 +16,6 @@ concurrency:
16
16
 
17
17
  env:
18
18
  FLUTTER_VERSION: '3.24.1'
19
- FLUTTER_WEB_RENDERER: 'html'
20
19
  NODE_VERSION: '22.x'
21
20
  permissions:
22
21
  contents: read
@@ -37,6 +36,5 @@ jobs:
37
36
  branch_name: 'master'
38
37
  node_version: ${{ env.NODE_VERSION }}
39
38
  flutter_version: ${{ env.FLUTTER_VERSION }}
40
- flutter_web_renderer: ${{ env.FLUTTER_WEB_RENDERER }}
41
39
  environment: 'production'
42
40
  commit_hash: ${{ github.sha }}
@@ -0,0 +1,295 @@
1
+ name: Weekly Workflow Summary Collector
2
+
3
+ on:
4
+ schedule:
5
+ - cron: '0 10 * * 3' # Every Wednesday at 10:00 UTC (14:00 GST)
6
+ - cron: '0 10 * * 5' # Every Friday at 10:00 UTC (14:00 GST)
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ actions: read
11
+ contents: read
12
+
13
+ env:
14
+ # Prefixes only — run_id suffix is appended by the source workflows
15
+ DOCSYNC_PREFIX: 'docsync-event-log-' # file inside zip: docsync-payload.json (JSON array)
16
+ CLAUDE_PREFIX: 'claude-review-summary-' # file inside zip: click2fix-payload.json (JSON object)
17
+ MAX_RUNS: '30'
18
+
19
+ jobs:
20
+ collect-summaries:
21
+ name: Collect and compile workflow artifacts
22
+ runs-on: ubuntu-latest
23
+
24
+ steps:
25
+ # ── Step 1: Metadata ─────────────────────────────────────────────────
26
+ - name: Compute metadata
27
+ id: meta
28
+ env:
29
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
30
+ REPO: ${{ github.repository }}
31
+ run: |
32
+ echo "date=$(date -u +%Y-%m-%d)" >> $GITHUB_OUTPUT
33
+ echo "week=$(date -u +%Y-W%V)" >> $GITHUB_OUTPUT
34
+
35
+ # Determine the artifact collection cutoff using the ACTUAL completion time of the
36
+ # last successful run of this workflow (not a hardcoded schedule time).
37
+ # This correctly handles:
38
+ # - Cron delays (15 min, 1 hr, or any amount)
39
+ # - Both directions: Wed→Fri and Fri→next Wed
40
+ # - Manual triggers: also start from where the last run left off
41
+ # The current run is still "in_progress" so querying status=success returns
42
+ # the previous successful run — exactly the cutoff we need.
43
+ LAST_RUN=$(gh api \
44
+ "/repos/$REPO/actions/workflows/weekly-workflow-collector.yml/runs?status=success&per_page=1" \
45
+ --jq '.workflow_runs[0] | {id: .id, completed_at: .updated_at, event: .event}')
46
+
47
+ if [ -n "$LAST_RUN" ] && [ "$(echo "$LAST_RUN" | jq -r '.id')" != "null" ]; then
48
+ SINCE=$(echo "$LAST_RUN" | jq -r '.completed_at')
49
+ SINCE_RUN_ID=$(echo "$LAST_RUN" | jq -r '.id')
50
+ SINCE_RUN_EVENT=$(echo "$LAST_RUN"| jq -r '.event')
51
+ SINCE_FALLBACK="false"
52
+ echo "Cutoff: artifacts created after run #$SINCE_RUN_ID (trigger: $SINCE_RUN_EVENT) completed at $SINCE"
53
+ else
54
+ SINCE=$(date -u -d "7 days ago" +%Y-%m-%dT%H:%M:%SZ)
55
+ SINCE_RUN_ID="none"
56
+ SINCE_RUN_EVENT="none"
57
+ SINCE_FALLBACK="true"
58
+ echo "No previous successful run found — falling back to 7 days ago: $SINCE"
59
+ fi
60
+
61
+ echo "since=$SINCE" >> $GITHUB_OUTPUT
62
+ echo "since_run_id=$SINCE_RUN_ID" >> $GITHUB_OUTPUT
63
+ echo "since_run_event=$SINCE_RUN_EVENT" >> $GITHUB_OUTPUT
64
+ echo "since_fallback=$SINCE_FALLBACK" >> $GITHUB_OUTPUT
65
+
66
+ # ── Step 2: Download DocSync artifacts ──────────────────────────────
67
+ # Artifact name: docsync-event-log-<run_id>
68
+ # File inside: docsync-payload.json (JSON array of events)
69
+ # Retention: 90 days
70
+ - name: Download DocSync AI artifacts
71
+ env:
72
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
73
+ REPO: ${{ github.repository }}
74
+ SINCE: ${{ steps.meta.outputs.since }}
75
+ run: |
76
+ mkdir -p downloads/docsync
77
+
78
+ artifact_ids=$(gh api "/repos/$REPO/actions/artifacts?per_page=100" \
79
+ --jq "[.artifacts[]
80
+ | select(.name | startswith(\"$DOCSYNC_PREFIX\"))
81
+ | select(.expired == false)
82
+ | select(.created_at >= \"$SINCE\")]
83
+ | sort_by(.created_at) | reverse | .[:$MAX_RUNS] | .[].id")
84
+
85
+ if [ -z "$artifact_ids" ]; then
86
+ echo "WARNING: No non-expired artifacts found matching prefix '$DOCSYNC_PREFIX'"
87
+ exit 0
88
+ fi
89
+
90
+ for id in $artifact_ids; do
91
+ echo "Downloading docsync artifact id=$id"
92
+ curl -sL \
93
+ -H "Authorization: Bearer $GH_TOKEN" \
94
+ -H "Accept: application/vnd.github+json" \
95
+ "https://api.github.com/repos/$REPO/actions/artifacts/$id/zip" \
96
+ -o "downloads/docsync/$id.zip"
97
+ unzip -q "downloads/docsync/$id.zip" -d "downloads/docsync/$id/"
98
+ rm "downloads/docsync/$id.zip"
99
+ done
100
+
101
+ echo "DocSync: downloaded $(ls -d downloads/docsync/*/ 2>/dev/null | wc -l) artifact(s)"
102
+
103
+ # ── Step 3: Download Claude PR Review artifacts ──────────────────────
104
+ # Artifact name: claude-review-summary-<run_id>
105
+ # File inside: click2fix-payload.json (single JSON object)
106
+ # Retention: 7 days ← cron must run before these expire
107
+ - name: Download Claude PR Review artifacts
108
+ env:
109
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
110
+ REPO: ${{ github.repository }}
111
+ SINCE: ${{ steps.meta.outputs.since }}
112
+ run: |
113
+ mkdir -p downloads/claude
114
+
115
+ artifact_ids=$(gh api "/repos/$REPO/actions/artifacts?per_page=100" \
116
+ --jq "[.artifacts[]
117
+ | select(.name | startswith(\"$CLAUDE_PREFIX\"))
118
+ | select(.expired == false)
119
+ | select(.created_at >= \"$SINCE\")]
120
+ | sort_by(.created_at) | reverse | .[:$MAX_RUNS] | .[].id")
121
+
122
+ if [ -z "$artifact_ids" ]; then
123
+ echo "WARNING: No non-expired artifacts found matching prefix '$CLAUDE_PREFIX'"
124
+ echo "NOTE: Claude artifacts expire after 7 days — ensure this cron runs within that window."
125
+ exit 0
126
+ fi
127
+
128
+ for id in $artifact_ids; do
129
+ echo "Downloading claude artifact id=$id"
130
+ curl -sL \
131
+ -H "Authorization: Bearer $GH_TOKEN" \
132
+ -H "Accept: application/vnd.github+json" \
133
+ "https://api.github.com/repos/$REPO/actions/artifacts/$id/zip" \
134
+ -o "downloads/claude/$id.zip"
135
+ unzip -q "downloads/claude/$id.zip" -d "downloads/claude/$id/"
136
+ rm "downloads/claude/$id.zip"
137
+ done
138
+
139
+ echo "Claude: downloaded $(ls -d downloads/claude/*/ 2>/dev/null | wc -l) artifact(s)"
140
+
141
+ # ── Step 4: Merge into one structured JSON file ──────────────────────
142
+ - name: Compile into workflow-summaries.json
143
+ env:
144
+ REPO: ${{ github.repository }}
145
+ COLLECTION_WEEK: ${{ steps.meta.outputs.week }}
146
+ COLLECTION_DATE: ${{ steps.meta.outputs.date }}
147
+ run: |
148
+ python3 - <<'PYEOF'
149
+ import json, os
150
+ from datetime import datetime, timezone
151
+ from pathlib import Path
152
+
153
+ REPO = os.environ["REPO"]
154
+ COLLECTION_WEEK = os.environ["COLLECTION_WEEK"]
155
+ COLLECTION_DATE = os.environ["COLLECTION_DATE"]
156
+
157
+ # Describes where to find each workflow's artifacts and how to read them.
158
+ # data_format:
159
+ # "array" -> the JSON file is a list of event objects (DocSync JSONL -> jq -s)
160
+ # "object" -> the JSON file is a single payload object (Claude EVENT_PAYLOAD)
161
+ SOURCES = {
162
+ "DocSync AI - Documentation Sync": {
163
+ "dir": Path("downloads/docsync"),
164
+ "filename": "docsync-payload.json",
165
+ "data_format": "array",
166
+ },
167
+ "Claude PR Review": {
168
+ "dir": Path("downloads/claude"),
169
+ "filename": "click2fix-payload.json",
170
+ "data_format": "object",
171
+ "retention_warning": "Artifacts expire after 7 days",
172
+ },
173
+ }
174
+
175
+ result = {
176
+ "generated_at": datetime.now(timezone.utc).isoformat().replace("+00:00", "Z"),
177
+ "collection_week": COLLECTION_WEEK,
178
+ "collection_date": COLLECTION_DATE,
179
+ "repository": REPO,
180
+ "workflows": {},
181
+ }
182
+
183
+ for wf_name, cfg in SOURCES.items():
184
+ base_dir = cfg["dir"]
185
+ target_file = cfg["filename"]
186
+ fmt = cfg["data_format"]
187
+ runs = []
188
+
189
+ if not base_dir.exists() or not any(base_dir.iterdir()):
190
+ entry = {
191
+ "workflow_name": wf_name,
192
+ "total_runs_collected": 0,
193
+ "warning": "No artifacts downloaded",
194
+ "runs": [],
195
+ }
196
+ if "retention_warning" in cfg:
197
+ entry["retention_note"] = cfg["retention_warning"]
198
+ result["workflows"][wf_name] = entry
199
+ print(f" {wf_name}: 0 runs")
200
+ continue
201
+
202
+ # artifact_id is the folder name (we named folders by GitHub artifact id)
203
+ for artifact_dir in sorted(base_dir.iterdir(), reverse=True):
204
+ if not artifact_dir.is_dir():
205
+ continue
206
+
207
+ payload_file = artifact_dir / target_file
208
+ if not payload_file.exists():
209
+ # Fallback: grab any JSON file present
210
+ candidates = list(artifact_dir.rglob("*.json"))
211
+ if not candidates:
212
+ print(f" WARN: No JSON in {artifact_dir.name}, skipping")
213
+ continue
214
+ payload_file = candidates[0]
215
+ print(f" NOTE: Using fallback file '{payload_file.name}' in {artifact_dir.name}")
216
+
217
+ try:
218
+ raw = json.loads(payload_file.read_text(encoding="utf-8"))
219
+ except json.JSONDecodeError as e:
220
+ print(f" WARN: Could not parse {payload_file}: {e}")
221
+ continue
222
+
223
+ run_entry = {
224
+ "artifact_id": artifact_dir.name,
225
+ "source_file": payload_file.name,
226
+ }
227
+
228
+ if fmt == "array":
229
+ # DocSync: JSON array of individual event objects
230
+ events = raw if isinstance(raw, list) else [raw]
231
+ run_entry["event_count"] = len(events)
232
+ run_entry["events"] = events
233
+ else:
234
+ # Claude: single JSON object -> the entire payload
235
+ run_entry["event_count"] = 1
236
+ run_entry["payload"] = raw
237
+
238
+ runs.append(run_entry)
239
+
240
+ wf_entry = {
241
+ "workflow_name": wf_name,
242
+ "total_runs_collected": len(runs),
243
+ "runs": runs,
244
+ }
245
+ if "retention_warning" in cfg:
246
+ wf_entry["retention_note"] = cfg["retention_warning"]
247
+
248
+ result["workflows"][wf_name] = wf_entry
249
+ total_events = sum(r["event_count"] for r in runs)
250
+ print(f" {wf_name}: {len(runs)} run(s), {total_events} event(s) total")
251
+
252
+ Path("workflow-summaries.json").write_text(
253
+ json.dumps(result, indent=2, ensure_ascii=False),
254
+ encoding="utf-8",
255
+ )
256
+ print("\\nworkflow-summaries.json written")
257
+ PYEOF
258
+
259
+ # ── Step 5: Job summary ──────────────────────────────────────────────
260
+ - name: Write job summary
261
+ run: |
262
+ {
263
+ echo "## Weekly Workflow Summary Collector"
264
+ echo ""
265
+ echo "| | |"
266
+ echo "|---|---|"
267
+ echo "| **Week** | \`${{ steps.meta.outputs.week }}\` |"
268
+ echo "| **Date** | \`${{ steps.meta.outputs.date }}\` |"
269
+ echo "| **Repo** | \`${{ github.repository }}\` |"
270
+ echo "| **Triggered by** | \`${{ github.event_name }}\` |"
271
+ echo "| **Collecting artifacts from** | \`${{ steps.meta.outputs.since }}\` UTC onwards |"
272
+ if [ "${{ steps.meta.outputs.since_fallback }}" = "true" ]; then
273
+ echo "| **Cutoff basis** | ⚠️ No previous successful run found — used 7-day fallback |"
274
+ else
275
+ echo "| **Cutoff basis** | Last successful run [#${{ steps.meta.outputs.since_run_id }}](https://github.com/${{ github.repository }}/actions/runs/${{ steps.meta.outputs.since_run_id }}) (triggered by: \`${{ steps.meta.outputs.since_run_event }}\`) |"
276
+ fi
277
+ echo ""
278
+ jq -r '
279
+ .workflows | to_entries[] |
280
+ "### \(.key)\n" +
281
+ "- **Runs collected**: \(.value.total_runs_collected)\n" +
282
+ "- **Total events**: \([.value.runs[].event_count] | add // 0)\n" +
283
+ (if .value.warning then "- ⚠️ Warning: \(.value.warning)\n" else "" end) +
284
+ (if .value.retention_note then "- ℹ️ Note: \(.value.retention_note)\n" else "" end)
285
+ ' workflow-summaries.json
286
+ } >> $GITHUB_STEP_SUMMARY
287
+
288
+ # ── Step 6: Upload compiled artifact ────────────────────────────────
289
+ - name: Upload workflow-summaries artifact
290
+ uses: actions/upload-artifact@v4
291
+ with:
292
+ name: workflow-summaries-${{ steps.meta.outputs.week }}
293
+ path: workflow-summaries.json
294
+ retention-days: 90
295
+ if-no-files-found: error
package/CHANGELOG.md CHANGED
@@ -1,7 +1,21 @@
1
- ## [1.9.5](https://github.com/deriv-com/smartcharts-champion/compare/v1.9.4...v1.9.5) (2026-03-10)
1
+ ## [1.9.7](https://github.com/deriv-com/smartcharts-champion/compare/v1.9.6...v1.9.7) (2026-03-27)
2
2
 
3
3
 
4
4
  ### ♻️ Chores
5
5
 
6
- * keep chart data visible while fetching and defer loading ([#195](https://github.com/deriv-com/smartcharts-champion/issues/195)) ([4e9ecd0](https://github.com/deriv-com/smartcharts-champion/commit/4e9ecd043ad80fd85d5a9cf7b4e6962605bacdc5))
7
- * set smooth chart toggle enabled by default ([#196](https://github.com/deriv-com/smartcharts-champion/issues/196)) ([424e73f](https://github.com/deriv-com/smartcharts-champion/commit/424e73f13d6b8bf97724dffc84727d89391b8381))
6
+ * **deps:** bump flatted from 3.4.1 to 3.4.2 ([#207](https://github.com/deriv-com/smartcharts-champion/issues/207)) ([69b3c6a](https://github.com/deriv-com/smartcharts-champion/commit/69b3c6a4e5df1fcf6d20ea4229045bca672b3ed4))
7
+ * **deps:** bump undici ([#203](https://github.com/deriv-com/smartcharts-champion/issues/203)) ([4f9c4a7](https://github.com/deriv-com/smartcharts-champion/commit/4f9c4a7dc8d6e56e01dddfe5d283992e92d7f65d))
8
+ * **deps:** fix serialize-javascript RCE vulnerability ([#205](https://github.com/deriv-com/smartcharts-champion/issues/205)) ([99ce9dc](https://github.com/deriv-com/smartcharts-champion/commit/99ce9dc94f02ffa634207cecab888b575eb38c32))
9
+ * **deps:** patch CVE-2023-44270 postcss line return parsing ([#211](https://github.com/deriv-com/smartcharts-champion/issues/211)) ([20dc85b](https://github.com/deriv-com/smartcharts-champion/commit/20dc85b6aba6a5692d59dc776dd1f66b6ead8280))
10
+ * remove shiftai-cli ([#201](https://github.com/deriv-com/smartcharts-champion/issues/201)) ([18bebad](https://github.com/deriv-com/smartcharts-champion/commit/18bebad06ce478ccc974e8756884f9aef51e5254))
11
+
12
+
13
+ ### ⚙️ Continuous Integrations
14
+
15
+ * update claude.yml reusable workflow ([#209](https://github.com/deriv-com/smartcharts-champion/issues/209)) ([fdba67c](https://github.com/deriv-com/smartcharts-champion/commit/fdba67c36f929bb792d0985f053495d825b14f3c))
16
+
17
+
18
+ ### 📦 Code Refactoring
19
+
20
+ * migrate Flutter chart renderer to skwasm with canvaskit falback ([#206](https://github.com/deriv-com/smartcharts-champion/issues/206)) ([44bd1b9](https://github.com/deriv-com/smartcharts-champion/commit/44bd1b9c2136757a2f7db314403355af9f4a237a))
21
+ * Use compatible JS interop libraries to support WASM compilation ([#173](https://github.com/deriv-com/smartcharts-champion/issues/173)) ([fe99036](https://github.com/deriv-com/smartcharts-champion/commit/fe9903650a7ca266319020429677f0f141a8119b))
@@ -28905,37 +28905,6 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28905
28905
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28906
28906
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28907
28907
 
28908
- --------------------------------------------------------------------------------
28909
- js
28910
-
28911
- Copyright 2012, the Dart project authors.
28912
-
28913
- Redistribution and use in source and binary forms, with or without
28914
- modification, are permitted provided that the following conditions are
28915
- met:
28916
-
28917
- * Redistributions of source code must retain the above copyright
28918
- notice, this list of conditions and the following disclaimer.
28919
- * Redistributions in binary form must reproduce the above
28920
- copyright notice, this list of conditions and the following
28921
- disclaimer in the documentation and/or other materials provided
28922
- with the distribution.
28923
- * Neither the name of Google LLC nor the names of its
28924
- contributors may be used to endorse or promote products derived
28925
- from this software without specific prior written permission.
28926
-
28927
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28928
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28929
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28930
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28931
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28932
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28933
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28934
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28935
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28936
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28937
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28938
-
28939
28908
  --------------------------------------------------------------------------------
28940
28909
  json
28941
28910
 
@@ -1 +1 @@
1
- (()=>{var e={hasImageCodecs:!(typeof ImageDecoder>"u"||"Google Inc."!==navigator.vendor&&"Edg/"!==navigator.agent),hasChromiumBreakIterators:typeof Intl.v8BreakIterator<"u"&&typeof Intl.Segmenter<"u",supportsWasmGC:WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,95,1,120,0])),crossOriginIsolated:window.crossOriginIsolated};function t(...e){return new URL(r(...e),document.baseURI).toString()}function r(...e){return e.filter(e=>!!e).map((e,t)=>0===t?i(e):function(e){let t=0;for(;t<e.length&&"/"===e.charAt(t);)t++;return e.substring(t)}(i(e))).filter(e=>e.length).join("/")}function i(e){let t=e.length;for(;t>0&&"/"===e.charAt(t-1);)t--;return e.substring(0,t)}var n=class{constructor(){this._scriptLoaded=!1}setTrustedTypesPolicy(e){this._ttPolicy=e}async loadEntrypoint(e){let{entrypointUrl:r=t("main.dart.js"),onEntrypointLoaded:i,nonce:n}=e||{};return this._loadJSEntrypoint(r,i,n)}async load(e,r,i,n,a){a??=e=>{e.initializeEngine(i).then(e=>e.runApp())};let{entryPointBaseUrl:o}=i;if("dart2wasm"===e.compileTarget)return this._loadWasmEntrypoint(e,r,o,a);{let r=t(o,e.mainJsPath??"main.dart.js");return this._loadJSEntrypoint(r,a,n)}}didCreateEngineInitializer(e){"function"==typeof this._didCreateEngineInitializerResolve&&(this._didCreateEngineInitializerResolve(e),this._didCreateEngineInitializerResolve=null,delete _flutter.loader.didCreateEngineInitializer),"function"==typeof this._onEntrypointLoaded&&this._onEntrypointLoaded(e)}_loadJSEntrypoint(e,t,r){let i="function"==typeof t;if(!this._scriptLoaded){this._scriptLoaded=!0;let n=this._createScriptTag(e,r);if(!i)return new Promise((e,t)=>{this._didCreateEngineInitializerResolve=e,n.addEventListener("error",t),document.head.append(n)});this._onEntrypointLoaded=t,document.head.append(n)}}async _loadWasmEntrypoint(e,r,i,n){if(!this._scriptLoaded){this._scriptLoaded=!0,this._onEntrypointLoaded=n;let{mainWasmPath:a,jsSupportRuntimePath:o}=e,s=t(i,a),l=t(i,o);null!=this._ttPolicy&&(l=this._ttPolicy.createScriptURL(l));let c,d=WebAssembly.compileStreaming(fetch(s)),u=await import(l);c="skwasm"===e.renderer?(async()=>{let e=await r.skwasm;return window._flutter_skwasmInstance=e,{skwasm:e.wasmExports,skwasmWrapper:e,ffi:{memory:e.wasmMemory}}})():{};let p=await u.instantiate(d,c);await u.invoke(p)}}_createScriptTag(e,t){let r=document.createElement("script");r.type="application/javascript",t&&(r.nonce=t);let i=e;return null!=this._ttPolicy&&(i=this._ttPolicy.createScriptURL(e)),r.src=i,r}};async function a(e,t,r){if(t<0)return e;let i,n=new Promise((e,n)=>{i=setTimeout(()=>{n(new Error(`${r} took more than ${t}ms to resolve. Moving on.`,{cause:a}))},t)});return Promise.race([e,n]).finally(()=>{clearTimeout(i)})}var o=class{setTrustedTypesPolicy(e){this._ttPolicy=e}loadServiceWorker(e){if(!e)return Promise.resolve();if(!("serviceWorker"in navigator)){let e="Service Worker API unavailable.";return window.isSecureContext||(e+="\nThe current context is NOT secure.",e+="\nRead more: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts"),Promise.reject(new Error(e))}let{serviceWorkerVersion:r,serviceWorkerUrl:i=t(`flutter_service_worker.js?v=${r}`),timeoutMillis:n=4e3}=e,o=i;return null!=this._ttPolicy&&(o=this._ttPolicy.createScriptURL(o)),a(navigator.serviceWorker.register(o).then(e=>this._getNewServiceWorker(e,r)).then(this._waitForServiceWorkerActivation),n,"prepareServiceWorker")}async _getNewServiceWorker(e,t){if(!e.active&&(e.installing||e.waiting))return e.installing||e.waiting;if(e.active.scriptURL.endsWith(t))return e.active;{let t=await e.update();return t.installing||t.waiting||t.active}}async _waitForServiceWorkerActivation(e){if(!e||"activated"===e.state){if(e)return;throw new Error("Cannot activate a null service worker!")}return new Promise((t,r)=>{e.addEventListener("statechange",()=>{"activated"===e.state&&t()})})}},s=class{constructor(e,t="flutter-js"){let r=e||[/\.js$/,/\.mjs$/];window.trustedTypes&&(this.policy=trustedTypes.createPolicy(t,{createScriptURL:function(e){if(e.startsWith("blob:"))return e;let i=new URL(e,window.location),n=i.pathname.split("/").pop();if(r.some(e=>e.test(n)))return i.toString();console.error("URL rejected by TrustedTypes policy",t,":",e,"(download prevented)")}}))}},l=e=>{let t=WebAssembly.compileStreaming(fetch(e));return(e,r)=>((async()=>{let i=await t,n=await WebAssembly.instantiate(i,e);r(n,i)})(),{})};window._flutter||(window._flutter={}),window._flutter.loader||(window._flutter.loader=new class{async loadEntrypoint(e){let{serviceWorker:t,...r}=e||{},i=new s,a=new o;a.setTrustedTypesPolicy(i.policy),await a.loadServiceWorker(t).catch(e=>{console.warn("Exception while loading service worker:",e)});let l=new n;return l.setTrustedTypesPolicy(i.policy),this.didCreateEngineInitializer=l.didCreateEngineInitializer.bind(l),l.loadEntrypoint(r)}async load({serviceWorkerSettings:i,onEntrypointLoaded:a,nonce:c,config:d}={}){d??={};let u=_flutter.buildConfig;if(!u)throw"FlutterLoader.load requires _flutter.buildConfig to be set";let p=u.builds.find(t=>!("dart2wasm"===t.compileTarget&&!e.supportsWasmGC||d.renderer&&!((e,t)=>"auto"===e.renderer?"canvaskit"==t||"html"==t:e.renderer==t)(t,d.renderer))&&(t=>"skwasm"!==t||e.crossOriginIsolated&&e.hasChromiumBreakIterators&&e.hasImageCodecs&&e.supportsWasmGC)(t.renderer));if(!p)throw"FlutterLoader could not find a build compatible with configuration and environment.";let w={};w.flutterTT=new s,i&&(w.serviceWorkerLoader=new o,w.serviceWorkerLoader.setTrustedTypesPolicy(w.flutterTT.policy),await w.serviceWorkerLoader.loadServiceWorker(i).catch(e=>{console.warn("Exception while loading service worker:",e)}));let m=function(e,t){return e.canvasKitBaseUrl?e.canvasKitBaseUrl:t.engineRevision&&!t.useLocalCanvasKit?r("https://www.gstatic.com/flutter-canvaskit",t.engineRevision):"canvaskit"}(d,u);"canvaskit"===p.renderer?w.canvasKit=((e,r,i,n)=>(window.flutterCanvasKitLoaded=(async()=>{if(window.flutterCanvasKit)return window.flutterCanvasKit;let a=i.hasChromiumBreakIterators&&i.hasImageCodecs;if(!a&&"chromium"==r.canvasKitVariant)throw"Chromium CanvasKit variant specifically requested, but unsupported in this browser";let o=a&&"full"!==r.canvasKitVariant,s=n;o&&(s=t(s,"chromium"));let c=t(s,"canvaskit.js");e.flutterTT.policy&&(c=e.flutterTT.policy.createScriptURL(c));let d=l(t(s,"canvaskit.wasm")),u=await import(c);return window.flutterCanvasKit=await u.default({instantiateWasm:d}),window.flutterCanvasKit})(),window.flutterCanvasKitLoaded))(w,d,e,m):"skwasm"===p.renderer&&(w.skwasm=(async(e,r,i,n)=>{let a=t(n,"skwasm.js"),o=a;e.flutterTT.policy&&(o=e.flutterTT.policy.createScriptURL(o));let s=l(t(n,"skwasm.wasm"));return await(await import(o)).default({instantiateWasm:s,locateFile:(e,t)=>{let r=t+e;return r.endsWith(".worker.js")?URL.createObjectURL(new Blob([`importScripts('${r}');`],{type:"application/javascript"})):r},mainScriptUrlOrBlob:a})})(w,0,0,m));let f=new n;return f.setTrustedTypesPolicy(w.flutterTT.policy),this.didCreateEngineInitializer=f.didCreateEngineInitializer.bind(f),f.load(p,w,d,c,a)}})})(),window._flutter||(window._flutter={}),_flutter.buildConfig={engineRevision:"c9b9d5780da342eb3f0f5e439a7db06f7d112575",builds:[{compileTarget:"dart2js",renderer:"html",mainJsPath:"main.dart.js"}]},_flutter.loader.load({serviceWorkerSettings:{serviceWorkerVersion:"2492760801"}});
1
+ (()=>{var e={hasImageCodecs:!(typeof ImageDecoder>"u"||"Google Inc."!==navigator.vendor&&"Edg/"!==navigator.agent),hasChromiumBreakIterators:typeof Intl.v8BreakIterator<"u"&&typeof Intl.Segmenter<"u",supportsWasmGC:WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,95,1,120,0])),crossOriginIsolated:window.crossOriginIsolated};function t(...e){return new URL(r(...e),document.baseURI).toString()}function r(...e){return e.filter(e=>!!e).map((e,t)=>0===t?i(e):function(e){let t=0;for(;t<e.length&&"/"===e.charAt(t);)t++;return e.substring(t)}(i(e))).filter(e=>e.length).join("/")}function i(e){let t=e.length;for(;t>0&&"/"===e.charAt(t-1);)t--;return e.substring(0,t)}var n=class{constructor(){this._scriptLoaded=!1}setTrustedTypesPolicy(e){this._ttPolicy=e}async loadEntrypoint(e){let{entrypointUrl:r=t("main.dart.js"),onEntrypointLoaded:i,nonce:n}=e||{};return this._loadJSEntrypoint(r,i,n)}async load(e,r,i,n,a){a??=e=>{e.initializeEngine(i).then(e=>e.runApp())};let{entryPointBaseUrl:o}=i;if("dart2wasm"===e.compileTarget)return this._loadWasmEntrypoint(e,r,o,a);{let r=t(o,e.mainJsPath??"main.dart.js");return this._loadJSEntrypoint(r,a,n)}}didCreateEngineInitializer(e){"function"==typeof this._didCreateEngineInitializerResolve&&(this._didCreateEngineInitializerResolve(e),this._didCreateEngineInitializerResolve=null,delete _flutter.loader.didCreateEngineInitializer),"function"==typeof this._onEntrypointLoaded&&this._onEntrypointLoaded(e)}_loadJSEntrypoint(e,t,r){let i="function"==typeof t;if(!this._scriptLoaded){this._scriptLoaded=!0;let n=this._createScriptTag(e,r);if(!i)return new Promise((e,t)=>{this._didCreateEngineInitializerResolve=e,n.addEventListener("error",t),document.head.append(n)});this._onEntrypointLoaded=t,document.head.append(n)}}async _loadWasmEntrypoint(e,r,i,n){if(!this._scriptLoaded){this._scriptLoaded=!0,this._onEntrypointLoaded=n;let{mainWasmPath:a,jsSupportRuntimePath:o}=e,s=t(i,a),l=t(i,o);null!=this._ttPolicy&&(l=this._ttPolicy.createScriptURL(l));let c,d=WebAssembly.compileStreaming(fetch(s)),u=await import(l);c="skwasm"===e.renderer?(async()=>{let e=await r.skwasm;return window._flutter_skwasmInstance=e,{skwasm:e.wasmExports,skwasmWrapper:e,ffi:{memory:e.wasmMemory}}})():{};let p=await u.instantiate(d,c);await u.invoke(p)}}_createScriptTag(e,t){let r=document.createElement("script");r.type="application/javascript",t&&(r.nonce=t);let i=e;return null!=this._ttPolicy&&(i=this._ttPolicy.createScriptURL(e)),r.src=i,r}};async function a(e,t,r){if(t<0)return e;let i,n=new Promise((e,n)=>{i=setTimeout(()=>{n(new Error(`${r} took more than ${t}ms to resolve. Moving on.`,{cause:a}))},t)});return Promise.race([e,n]).finally(()=>{clearTimeout(i)})}var o=class{setTrustedTypesPolicy(e){this._ttPolicy=e}loadServiceWorker(e){if(!e)return Promise.resolve();if(!("serviceWorker"in navigator)){let e="Service Worker API unavailable.";return window.isSecureContext||(e+="\nThe current context is NOT secure.",e+="\nRead more: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts"),Promise.reject(new Error(e))}let{serviceWorkerVersion:r,serviceWorkerUrl:i=t(`flutter_service_worker.js?v=${r}`),timeoutMillis:n=4e3}=e,o=i;return null!=this._ttPolicy&&(o=this._ttPolicy.createScriptURL(o)),a(navigator.serviceWorker.register(o).then(e=>this._getNewServiceWorker(e,r)).then(this._waitForServiceWorkerActivation),n,"prepareServiceWorker")}async _getNewServiceWorker(e,t){if(!e.active&&(e.installing||e.waiting))return e.installing||e.waiting;if(e.active.scriptURL.endsWith(t))return e.active;{let t=await e.update();return t.installing||t.waiting||t.active}}async _waitForServiceWorkerActivation(e){if(!e||"activated"===e.state){if(e)return;throw new Error("Cannot activate a null service worker!")}return new Promise((t,r)=>{e.addEventListener("statechange",()=>{"activated"===e.state&&t()})})}},s=class{constructor(e,t="flutter-js"){let r=e||[/\.js$/,/\.mjs$/];window.trustedTypes&&(this.policy=trustedTypes.createPolicy(t,{createScriptURL:function(e){if(e.startsWith("blob:"))return e;let i=new URL(e,window.location),n=i.pathname.split("/").pop();if(r.some(e=>e.test(n)))return i.toString();console.error("URL rejected by TrustedTypes policy",t,":",e,"(download prevented)")}}))}},l=e=>{let t=WebAssembly.compileStreaming(fetch(e));return(e,r)=>((async()=>{let i=await t,n=await WebAssembly.instantiate(i,e);r(n,i)})(),{})};window._flutter||(window._flutter={}),window._flutter.loader||(window._flutter.loader=new class{async loadEntrypoint(e){let{serviceWorker:t,...r}=e||{},i=new s,a=new o;a.setTrustedTypesPolicy(i.policy),await a.loadServiceWorker(t).catch(e=>{console.warn("Exception while loading service worker:",e)});let l=new n;return l.setTrustedTypesPolicy(i.policy),this.didCreateEngineInitializer=l.didCreateEngineInitializer.bind(l),l.loadEntrypoint(r)}async load({serviceWorkerSettings:i,onEntrypointLoaded:a,nonce:c,config:d}={}){d??={};let u=_flutter.buildConfig;if(!u)throw"FlutterLoader.load requires _flutter.buildConfig to be set";let p=u.builds.find(t=>!("dart2wasm"===t.compileTarget&&!e.supportsWasmGC||d.renderer&&!((e,t)=>"auto"===e.renderer?"canvaskit"==t||"html"==t:e.renderer==t)(t,d.renderer))&&(t=>"skwasm"!==t||e.crossOriginIsolated&&e.hasChromiumBreakIterators&&e.hasImageCodecs&&e.supportsWasmGC)(t.renderer));if(!p)throw"FlutterLoader could not find a build compatible with configuration and environment.";let w={};w.flutterTT=new s,i&&(w.serviceWorkerLoader=new o,w.serviceWorkerLoader.setTrustedTypesPolicy(w.flutterTT.policy),await w.serviceWorkerLoader.loadServiceWorker(i).catch(e=>{console.warn("Exception while loading service worker:",e)}));let m=function(e,t){return e.canvasKitBaseUrl?e.canvasKitBaseUrl:t.engineRevision&&!t.useLocalCanvasKit?r("https://www.gstatic.com/flutter-canvaskit",t.engineRevision):"canvaskit"}(d,u);"canvaskit"===p.renderer?w.canvasKit=((e,r,i,n)=>(window.flutterCanvasKitLoaded=(async()=>{if(window.flutterCanvasKit)return window.flutterCanvasKit;let a=i.hasChromiumBreakIterators&&i.hasImageCodecs;if(!a&&"chromium"==r.canvasKitVariant)throw"Chromium CanvasKit variant specifically requested, but unsupported in this browser";let o=a&&"full"!==r.canvasKitVariant,s=n;o&&(s=t(s,"chromium"));let c=t(s,"canvaskit.js");e.flutterTT.policy&&(c=e.flutterTT.policy.createScriptURL(c));let d=l(t(s,"canvaskit.wasm")),u=await import(c);return window.flutterCanvasKit=await u.default({instantiateWasm:d}),window.flutterCanvasKit})(),window.flutterCanvasKitLoaded))(w,d,e,m):"skwasm"===p.renderer&&(w.skwasm=(async(e,r,i,n)=>{let a=t(n,"skwasm.js"),o=a;e.flutterTT.policy&&(o=e.flutterTT.policy.createScriptURL(o));let s=l(t(n,"skwasm.wasm"));return await(await import(o)).default({instantiateWasm:s,locateFile:(e,t)=>{let r=t+e;return r.endsWith(".worker.js")?URL.createObjectURL(new Blob([`importScripts('${r}');`],{type:"application/javascript"})):r},mainScriptUrlOrBlob:a})})(w,0,0,m));let f=new n;return f.setTrustedTypesPolicy(w.flutterTT.policy),this.didCreateEngineInitializer=f.didCreateEngineInitializer.bind(f),f.load(p,w,d,c,a)}})})(),window._flutter||(window._flutter={}),_flutter.buildConfig={engineRevision:"c9b9d5780da342eb3f0f5e439a7db06f7d112575",builds:[{compileTarget:"dart2js",renderer:"html",mainJsPath:"main.dart.js"}]},_flutter.loader.load({serviceWorkerSettings:{serviceWorkerVersion:"2856592316"}});
@@ -1 +1 @@
1
- "use strict";const MANIFEST="flutter-app-manifest",TEMP="flutter-temp-cache",CACHE_NAME="flutter-app-cache",RESOURCES={"favicon.png":"5dcef449791fa27946b3d35ad8803796","assets/AssetManifest.json":"0e2784379e19e2053abcff2635e3e6ae","assets/NOTICES":"3addc03b78c4c9ab95afde0750197f90","assets/packages/deriv_chart/assets/fonts/quill_icons.ttf":"8e9f63f02fa78152f14dd9b5b5c4e92a","assets/AssetManifest.bin.json":"be3eb7dfd4bfedb8054bd74919851a8b","assets/fonts/MaterialIcons-Regular.otf":"d6db5dff634f0098a8fec881f24fa1e7","assets/fonts/IBMPlexSans-Regular.woff2":"4bb247144b2962b752857093491454e7","assets/fonts/IBMPlexSans-Bold.woff2":"19210a59bf50a6ba73fa97433170b4cf","assets/shaders/ink_sparkle.frag":"ecc85a2e95f5e9f53123dcaf8cb9b6ce","assets/AssetManifest.bin":"f049e764000ff7f4834702ea3985a348","assets/FontManifest.json":"84fa087dba170bffc9f3713aeebe836c","index.html":"42208c321c51f1f52d5645a807efaab1","/":"42208c321c51f1f52d5645a807efaab1","manifest.json":"a06b13fcde5dfd1e240278072e116d12","flutter_bootstrap.js":"b107c03f0b60dfa75db0390b42e6c806","main.dart.js":"76d4d5780bcd691eefa6d3c4115c861a","flutter.js":"f393d3c16b631f36852323de8e583132","canvaskit/skwasm.js.symbols":"262f4827a1317abb59d71d6c587a93e2","canvaskit/canvaskit.wasm":"1f237a213d7370cf95f443d896176460","canvaskit/skwasm.js":"694fda5704053957c2594de355805228","canvaskit/skwasm.wasm":"9f0c0c02b82a910d12ce0543ec130e60","canvaskit/canvaskit.js":"66177750aff65a66cb07bb44b8c6422b","canvaskit/canvaskit.js.symbols":"48c83a2ce573d9692e8d970e288d75f7","canvaskit/skwasm.worker.js":"89990e8c92bcb123999aa81f7e203b1c","canvaskit/chromium/canvaskit.wasm":"b1ac05b29c127d86df4bcfbf50dd902a","canvaskit/chromium/canvaskit.js":"671c6b4f8fcc199dcc551c7bb125f239","canvaskit/chromium/canvaskit.js.symbols":"a012ed99ccba193cf96bb2643003f6fc","version.json":"1756499d77011c0be564a414e567db76"},CORE=["main.dart.js","index.html","flutter_bootstrap.js","assets/AssetManifest.bin.json","assets/FontManifest.json"];async function downloadOffline(){var a=[],e=await caches.open(CACHE_NAME),s={};for(var t of await e.keys()){var c=t.url.substring(origin.length+1);""==c&&(c="/"),s[c]=!0}for(var n of Object.keys(RESOURCES))s[n]||a.push(n);return e.addAll(a)}function onlineFirst(a){return a.respondWith(fetch(a.request).then(e=>caches.open(CACHE_NAME).then(s=>(s.put(a.request,e.clone()),e))).catch(e=>caches.open(CACHE_NAME).then(s=>s.match(a.request).then(a=>{if(null!=a)return a;throw e}))))}self.addEventListener("install",a=>(self.skipWaiting(),a.waitUntil(caches.open(TEMP).then(a=>a.addAll(CORE.map(a=>new Request(a,{cache:"reload"}))))))),self.addEventListener("activate",function(a){return a.waitUntil(async function(){try{var a=await caches.open(CACHE_NAME),e=await caches.open(TEMP),s=await caches.open(MANIFEST),t=await s.match("manifest");if(!t){for(var c of(await caches.delete(CACHE_NAME),a=await caches.open(CACHE_NAME),await e.keys())){var n=await e.match(c);await a.put(c,n)}return await caches.delete(TEMP),await s.put("manifest",new Response(JSON.stringify(RESOURCES))),void self.clients.claim()}var f=await t.json(),i=self.location.origin;for(var c of await a.keys()){var r=c.url.substring(i.length+1);""==r&&(r="/"),RESOURCES[r]&&RESOURCES[r]==f[r]||await a.delete(c)}for(var c of await e.keys()){n=await e.match(c);await a.put(c,n)}return await caches.delete(TEMP),await s.put("manifest",new Response(JSON.stringify(RESOURCES))),void self.clients.claim()}catch(a){console.error("Failed to upgrade service worker: "+a),await caches.delete(CACHE_NAME),await caches.delete(TEMP),await caches.delete(MANIFEST)}}())}),self.addEventListener("fetch",a=>{if("GET"===a.request.method){var e=self.location.origin,s=a.request.url.substring(e.length+1);if(-1!=s.indexOf("?v=")&&(s=s.split("?v=")[0]),(a.request.url==e||a.request.url.startsWith(e+"/#")||""==s)&&(s="/"),RESOURCES[s])return"/"==s?onlineFirst(a):void a.respondWith(caches.open(CACHE_NAME).then(e=>e.match(a.request).then(s=>s||fetch(a.request).then(s=>(s&&Boolean(s.ok)&&e.put(a.request,s.clone()),s)))))}}),self.addEventListener("message",a=>{"skipWaiting"!==a.data?"downloadOffline"!==a.data||downloadOffline():self.skipWaiting()});
1
+ "use strict";const MANIFEST="flutter-app-manifest",TEMP="flutter-temp-cache",CACHE_NAME="flutter-app-cache",RESOURCES={"manifest.json":"a06b13fcde5dfd1e240278072e116d12","version.json":"1756499d77011c0be564a414e567db76","canvaskit/skwasm.js.symbols":"262f4827a1317abb59d71d6c587a93e2","canvaskit/skwasm.worker.js":"89990e8c92bcb123999aa81f7e203b1c","canvaskit/skwasm.js":"694fda5704053957c2594de355805228","canvaskit/canvaskit.js":"66177750aff65a66cb07bb44b8c6422b","canvaskit/canvaskit.wasm":"1f237a213d7370cf95f443d896176460","canvaskit/chromium/canvaskit.js":"671c6b4f8fcc199dcc551c7bb125f239","canvaskit/chromium/canvaskit.wasm":"b1ac05b29c127d86df4bcfbf50dd902a","canvaskit/chromium/canvaskit.js.symbols":"a012ed99ccba193cf96bb2643003f6fc","canvaskit/canvaskit.js.symbols":"48c83a2ce573d9692e8d970e288d75f7","canvaskit/skwasm.wasm":"9f0c0c02b82a910d12ce0543ec130e60","index.html":"46628c4c90833fd4359856205bfd1c55","/":"46628c4c90833fd4359856205bfd1c55","flutter.js":"f393d3c16b631f36852323de8e583132","assets/AssetManifest.bin":"f049e764000ff7f4834702ea3985a348","assets/packages/deriv_chart/assets/fonts/quill_icons.ttf":"8e9f63f02fa78152f14dd9b5b5c4e92a","assets/FontManifest.json":"84fa087dba170bffc9f3713aeebe836c","assets/NOTICES":"a73f0d601fa6d9e4745b1bbfbf3fec8a","assets/AssetManifest.json":"0e2784379e19e2053abcff2635e3e6ae","assets/shaders/ink_sparkle.frag":"ecc85a2e95f5e9f53123dcaf8cb9b6ce","assets/fonts/MaterialIcons-Regular.otf":"d6db5dff634f0098a8fec881f24fa1e7","assets/fonts/IBMPlexSans-Regular.woff2":"4bb247144b2962b752857093491454e7","assets/fonts/IBMPlexSans-Bold.woff2":"19210a59bf50a6ba73fa97433170b4cf","assets/AssetManifest.bin.json":"be3eb7dfd4bfedb8054bd74919851a8b","flutter_bootstrap.js":"def467ccb4d03a756edf874a607529de","favicon.png":"5dcef449791fa27946b3d35ad8803796","main.dart.js":"8165a7c1ee7a385438a25866d962d09f"},CORE=["main.dart.js","index.html","flutter_bootstrap.js","assets/AssetManifest.bin.json","assets/FontManifest.json"];async function downloadOffline(){var e=[],a=await caches.open(CACHE_NAME),s={};for(var t of await a.keys()){var c=t.url.substring(origin.length+1);""==c&&(c="/"),s[c]=!0}for(var n of Object.keys(RESOURCES))s[n]||e.push(n);return a.addAll(e)}function onlineFirst(e){return e.respondWith(fetch(e.request).then(a=>caches.open(CACHE_NAME).then(s=>(s.put(e.request,a.clone()),a))).catch(a=>caches.open(CACHE_NAME).then(s=>s.match(e.request).then(e=>{if(null!=e)return e;throw a}))))}self.addEventListener("install",e=>(self.skipWaiting(),e.waitUntil(caches.open(TEMP).then(e=>e.addAll(CORE.map(e=>new Request(e,{cache:"reload"}))))))),self.addEventListener("activate",function(e){return e.waitUntil(async function(){try{var e=await caches.open(CACHE_NAME),a=await caches.open(TEMP),s=await caches.open(MANIFEST),t=await s.match("manifest");if(!t){for(var c of(await caches.delete(CACHE_NAME),e=await caches.open(CACHE_NAME),await a.keys())){var n=await a.match(c);await e.put(c,n)}return await caches.delete(TEMP),await s.put("manifest",new Response(JSON.stringify(RESOURCES))),void self.clients.claim()}var f=await t.json(),i=self.location.origin;for(var c of await e.keys()){var r=c.url.substring(i.length+1);""==r&&(r="/"),RESOURCES[r]&&RESOURCES[r]==f[r]||await e.delete(c)}for(var c of await a.keys()){n=await a.match(c);await e.put(c,n)}return await caches.delete(TEMP),await s.put("manifest",new Response(JSON.stringify(RESOURCES))),void self.clients.claim()}catch(e){console.error("Failed to upgrade service worker: "+e),await caches.delete(CACHE_NAME),await caches.delete(TEMP),await caches.delete(MANIFEST)}}())}),self.addEventListener("fetch",e=>{if("GET"===e.request.method){var a=self.location.origin,s=e.request.url.substring(a.length+1);if(-1!=s.indexOf("?v=")&&(s=s.split("?v=")[0]),(e.request.url==a||e.request.url.startsWith(a+"/#")||""==s)&&(s="/"),RESOURCES[s])return"/"==s?onlineFirst(e):void e.respondWith(caches.open(CACHE_NAME).then(a=>a.match(e.request).then(s=>s||fetch(e.request).then(s=>(s&&Boolean(s.ok)&&a.put(e.request,s.clone()),s)))))}}),self.addEventListener("message",e=>{"skipWaiting"!==e.data?"downloadOffline"!==e.data||downloadOffline():self.skipWaiting()});