Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ChecksMate: implement new game #2507

Open
wants to merge 311 commits into
base: main
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
311 commits
Select commit Hold shift + click to select a range
ef1bc1f
Add clarity on multiworld settings
chesslogic Nov 16, 2023
d1e4d22
support castles, max pocket, and locked items
chesslogic Nov 19, 2023
0813f69
minor: update deathlink wording
chesslogic Nov 21, 2023
e6bd565
increase enemy piece costs, todo a locked_items algorithm
chesslogic Nov 21, 2023
a690076
raise sequences costs, relax chessmen count
chesslogic Nov 22, 2023
736be0c
more specific chessmen count
chesslogic Nov 22, 2023
be91e6b
minor: remove resolved todo
chesslogic Nov 25, 2023
31b9826
Move required material into Locations
chesslogic Nov 25, 2023
b75b578
refactor away logicmixin, add minimal to test accessibility
chesslogic Nov 25, 2023
7166ad3
use local random instead of per_slot_randoms
chesslogic Nov 25, 2023
655006e
reference self.random, compile rules
chesslogic Nov 25, 2023
55aec09
collect material, improve item groups, precollect enemies
chesslogic Nov 26, 2023
eaa764c
Merge branch 'main' into checks_mate
chesslogic Nov 26, 2023
f0bbf57
Update by deprecation. Start Options API.
chesslogic Nov 26, 2023
311cf17
Continue Options API migration
chesslogic Nov 26, 2023
cd9af44
Convert to Options API except for limits dictionary
chesslogic Nov 26, 2023
e78513f
Remove get_option_value
chesslogic Nov 26, 2023
7604113
Move limits to CMOptions static property
chesslogic Nov 26, 2023
481fd94
change version
chesslogic Nov 26, 2023
b13668c
improve material count, fumble with caching
chesslogic Nov 26, 2023
040ffe5
most of these are implemented
chesslogic Nov 26, 2023
58eaaa0
start counting material in tests
chesslogic Nov 26, 2023
d95f129
update tests for Options API
chesslogic Nov 26, 2023
aead4b9
The actual "bug"
chesslogic Nov 26, 2023
daf1f87
Merge branch 'options_tests' into checks_mate
chesslogic Nov 26, 2023
64fba66
failing tests for material count
chesslogic Nov 26, 2023
773be76
exclude inaccessible locations
chesslogic Nov 27, 2023
bf6cab6
possible pawn promotion location
chesslogic Nov 27, 2023
f232b02
improve collect to dict
chesslogic Nov 27, 2023
04b03b7
improve advanced collect debug
chesslogic Nov 27, 2023
2c62ddb
fix for excluded items miscounted in material
chesslogic Nov 27, 2023
2941497
minor: comments on collect and limit
chesslogic Nov 28, 2023
2e581a0
add a test for material
chesslogic Nov 28, 2023
f51fd6f
test for removing material
chesslogic Nov 28, 2023
cd6dd8e
describe material tests
chesslogic Nov 28, 2023
ba187f8
minor: do not copy paste your tests
chesslogic Nov 28, 2023
d819bbd
omit double negative in remove()
chesslogic Nov 29, 2023
c0399dd
remove starting item from material tests
chesslogic Nov 29, 2023
fc64f53
added custom non-cwda pieces
chesslogic Nov 30, 2023
2d10a0a
Replace FairyChessPieces with OptionSet, currently hidden on website …
chesslogic Nov 30, 2023
f63a44b
update army generation for optionset
chesslogic Nov 30, 2023
d99e878
unified army piece limits
chesslogic Nov 30, 2023
9f543c7
update limit for queennon
chesslogic Nov 30, 2023
a980993
fix wording errors wrt Ralph Betza's CwDA
chesslogic Nov 30, 2023
219d9b2
Increase {fairy+extra} king values
chesslogic Nov 30, 2023
31d3d93
not a fan of name "eurasian"
chesslogic Nov 30, 2023
904cfaf
Merge branch 'main' of https://github.com/ArchipelagoMW/Archipelago i…
chesslogic Nov 30, 2023
e1a78b7
change default types to stable
chesslogic Dec 2, 2023
c1e527e
move and rename options
chesslogic Dec 2, 2023
0324164
account for material costs of locked items
chesslogic Dec 2, 2023
45c8ef2
Create checksmate-example.yaml
chesslogic Dec 2, 2023
3629081
Add 4 example yaml configurations
chesslogic Dec 2, 2023
84d1ef8
handle invalid OptionSet of fairy chess pieces
chesslogic Dec 2, 2023
2b21982
minor: options wording around fide
chesslogic Dec 2, 2023
9c0cdb5
minor: reword vanilla comment in army generation
chesslogic Dec 3, 2023
383a478
improve standard examples
chesslogic Dec 3, 2023
c927124
change some default settings
chesslogic Dec 3, 2023
e3002a7
add not set (extremely important logic change)
chesslogic Dec 5, 2023
939d62d
rename king locations, add a test
chesslogic Dec 7, 2023
fda83ed
increase checkmate maxima cost
chesslogic Dec 7, 2023
2394ef6
minor: set type for yaml_locked_items
chesslogic Dec 7, 2023
f3a6d77
observe lockable items
chesslogic Dec 8, 2023
6b8043a
transfer examples to presets (incomplete)
chesslogic Dec 10, 2023
27886d2
continue preset conversions
chesslogic Dec 11, 2023
16ef70b
locations own their chessmen_expectations
chesslogic Dec 11, 2023
178b36c
reverse is not reversed
chesslogic Dec 11, 2023
94ac925
exclude impossible locations
chesslogic Dec 11, 2023
4bf9f4e
minor: tweak win cost
chesslogic Dec 11, 2023
3c21ecc
realised accessibility must remove items not lock others
chesslogic Dec 12, 2023
fdca34b
outline of castling and chessmen locking
chesslogic Dec 12, 2023
9b6b05e
determine lockable value of major
chesslogic Dec 12, 2023
23affe8
fix for min material range
chesslogic Dec 12, 2023
2a294c7
improve locking queen value
chesslogic Dec 12, 2023
d84a460
simplify material limits
chesslogic Dec 12, 2023
6cd878b
avoid counting past limits in wont_fit
chesslogic Dec 15, 2023
8b2788e
no idea why but i updated requirements.txt
chesslogic Dec 15, 2023
0b13ecd
Merge branch 'main' into checks_mate
chesslogic Dec 15, 2023
6df55ab
add bounding to material tests
chesslogic Dec 19, 2023
2b03bd1
Fix impossible logic
chesslogic Jan 2, 2024
bd5a7ff
someone wanted this to be a loop so now it is
chesslogic Jan 2, 2024
6c7e26c
the AI takes midgame locations very seriously
chesslogic Feb 4, 2024
ddb3b17
simplify self.multiworld, self.player in __init__
chesslogic Feb 9, 2024
72e272e
Simple performance improvement via reading property directly
chesslogic Feb 9, 2024
9c48f2b
store upgrade count for Universal Tracker
chesslogic Feb 11, 2024
55ade96
Add faster "total queens" to castle rules
chesslogic Feb 24, 2024
57902b2
Merge branch 'main' into checks_mate
chesslogic Feb 24, 2024
838ead9
Allow 32 pawns instead of 14
chesslogic Mar 11, 2024
a876a82
Maximize forwardness
chesslogic Mar 11, 2024
5c34a9e
fix for pocket_limit div 0
chesslogic Apr 18, 2024
a6cd42a
fix inline ifelse bug in chessmen count
chesslogic Jun 8, 2024
9f46e67
initial ideas on difficulty
chesslogic Jun 8, 2024
faf2248
move difficulty to safer file
chesslogic Jun 8, 2024
2144259
more capture locations, so as to support "oops all pawns" item distri…
chesslogic Jun 10, 2024
718d260
trivial change to castle locations chessmen expectations
chesslogic Jun 10, 2024
a19d3db
Merge branch 'main' into checks_mate
chesslogic Jun 10, 2024
d7d9932
introduce bug forcing pocket items but add more pawn forwardness for …
chesslogic Jun 10, 2024
bb8a370
add fairy_chess_piece_collection as an alternative to fairy_chess_pie…
chesslogic Jun 15, 2024
300305f
what I've done consistently breaks item placement somehow
chesslogic Jun 15, 2024
8a8afbd
tweak difficulty scaling. also fix inline if/else bug. I literally ju…
chesslogic Jun 15, 2024
4120f61
summarize difficulty
chesslogic Jun 15, 2024
e214b10
clarify max material text (39 vs 40)
chesslogic Jun 16, 2024
186d999
Import DeathLink in options. Reverse a dumb core change.
chesslogic Jun 16, 2024
bd66703
Merge branch 'main' into checks_mate
chesslogic Jun 18, 2024
2dfe062
start updating tests for changes in fairy piece options
chesslogic Jun 19, 2024
244a618
move inline chessmen_expectations into function (adds fn overhead but…
chesslogic Jun 19, 2024
f27e1bf
fix piece limit tests (regression after Camel feature)
chesslogic Jun 19, 2024
11d683a
Progress toward fixing too-little-material failures.
chesslogic Jun 20, 2024
b876f47
Consistently fix goal reachability.
chesslogic Jun 20, 2024
20d6404
fixes to config and setup for material test fixes
chesslogic Jun 22, 2024
73eb02d
fix pull from world options in material tests
chesslogic Jun 23, 2024
6f300ff
in material tests fix item placement during world setup
chesslogic Jun 26, 2024
47aca88
start eliminating tactics options
chesslogic Jun 26, 2024
15b04a5
create location material for grand chess
chesslogic Jun 26, 2024
e339f3b
id fixes
chesslogic Jun 26, 2024
d7d175f
add a few locations and material requirements. trying to conditionall…
chesslogic Jun 27, 2024
88479c9
fix for locations we didn't want to generate
chesslogic Jun 27, 2024
b09aea1
generation rules only for present locations
chesslogic Jun 28, 2024
860b9c1
remove excess items when fewer locations available
chesslogic Jun 29, 2024
be1d894
check grand material costs
chesslogic Jun 29, 2024
b64b8a3
fix location ids
chesslogic Jun 29, 2024
4cd798e
remove old progression items
chesslogic Jul 2, 2024
36b7605
increase pieces for grand variant
chesslogic Jul 2, 2024
81e12a7
upversion, limit tactics, increase maximum generated pieces
chesslogic Jul 3, 2024
04da7e7
Merge remote-tracking branch 'apmw/main' into checks_mate
chesslogic Jul 3, 2024
5f745d3
remove material options (in favor of Difficulty)
chesslogic Jul 10, 2024
4705091
add comment warning
chesslogic Jul 10, 2024
fe7fa71
remove unnecessary import
chesslogic Jul 10, 2024
bde77e4
test fixes for peer worlds
chesslogic Jul 12, 2024
4ecaf24
idk if the utility needs kwargs
chesslogic Jul 12, 2024
2ef4f08
fix presets, play nice with others
chesslogic Jul 12, 2024
0b98cf3
track material value of play as white
chesslogic Jul 13, 2024
e68feaf
Merge remote-tracking branch 'apmw/main' into checks_mate
chesslogic Jul 13, 2024
4ecd665
Delete tracker.apworld
chesslogic Jul 13, 2024
88b40b8
align option name with new semantic, FCPieces -> FCPieceCollectionCon…
chesslogic Jul 29, 2024
8381ef4
fix cm-ladx test collision
chesslogic Jul 29, 2024
8972515
restyle improper imports
chesslogic Jul 29, 2024
39bfb6d
remove outdated documentation
chesslogic Jul 30, 2024
7f256cc
Finalize pieces option, fix the example players
chesslogic Jul 30, 2024
22b5af4
Add get_filler_item_name
chesslogic Aug 2, 2024
7ab4ab3
Finish renaming fairy chess pieces
chesslogic Aug 2, 2024
94a00e1
Fix preset references to changed option
chesslogic Aug 2, 2024
ba5dfae
Add reference to renamed option in generate_early
chesslogic Aug 2, 2024
88e4e68
Rename option in Rules.py difficulty
chesslogic Aug 2, 2024
24dfb87
Fixes to omit the item link player
chesslogic Aug 2, 2024
38fd757
m: reword why useful items are good
chesslogic Aug 3, 2024
791d435
Merge remote-tracking branch 'apmw/main' into checks_mate
chesslogic Aug 3, 2024
d704298
m: Diffculty->Difficulty
chesslogic Aug 3, 2024
7ceffb6
Merge remote-tracking branch 'apmw/main' into checks_mate
chesslogic Aug 5, 2024
dd87c7f
Remove unrelated items from examples
chesslogic Aug 8, 2024
c518afe
Add 4 new simple Tactics to fill the location gap of Forks.
chesslogic Aug 9, 2024
3bcf488
Small difficulty tweaks to newer locations
chesslogic Aug 9, 2024
e90a88e
Actually exclude forks (can't sleep)
chesslogic Aug 9, 2024
a49040a
incorporate feedback involving relaxed locations
chesslogic Aug 11, 2024
6510d70
2.10
chesslogic Aug 17, 2024
a5ffe61
improve midgame pawn structure difficulty curve
chesslogic Aug 17, 2024
1f3eeff
rescale "of each"
chesslogic Aug 25, 2024
29c2629
lower 4+ series difficulties
chesslogic Sep 22, 2024
d36d2e9
Merge remote-tracking branch 'apmw/main' into checks_mate
chesslogic Sep 28, 2024
191028f
Add Super-Size Me! at the start of Super goal
chesslogic Oct 16, 2024
12b2978
Backport to 3.8
chesslogic Oct 17, 2024
3a88d54
Fix low piece limit infinite hang, pocket limit 0 crash
chesslogic Nov 6, 2024
3a3a052
require version 2.11
chesslogic Nov 6, 2024
ee143c8
Merge branch 'main' into checks_mate
chesslogic Nov 8, 2024
9fccaef
Reflect accessibility fixes in tests
chesslogic Nov 17, 2024
0591cdb
Remove unnecessary minimal from limits test
chesslogic Nov 17, 2024
2b3c96e
Add simple return types
chesslogic Nov 17, 2024
e75da4b
Fix type annotation of child enums
chesslogic Nov 17, 2024
acde41f
Reflect copy(dict) in subclasses
chesslogic Nov 17, 2024
950e0be
Fix test and preset references across files
chesslogic Nov 17, 2024
37a0816
reflect improved limit defaults in limit tests
chesslogic Nov 17, 2024
fa401ac
Update limits tests to locally new options format
chesslogic Nov 17, 2024
f9f0c25
Fix non-minimal accessibility!
chesslogic Nov 17, 2024
eaca8ce
m: Reference army option type instead of '0'
chesslogic Nov 17, 2024
330df29
m: Clarify that disabling Pocket Limit has been supported
chesslogic Nov 17, 2024
a3c6db7
Limit "exceeds max" material per chessmen to bypass "enough yet" only…
chesslogic Nov 17, 2024
61168d7
small update to empty preset
chesslogic Nov 17, 2024
af52db3
Merge branch 'main' into checks_mate
chesslogic Nov 17, 2024
6070d7b
m: Add TODO to resolve comment to use test.bases not WorldTestBase fo…
chesslogic Nov 17, 2024
f268af5
"def setting in CMWorld is dead"
chesslogic Nov 17, 2024
02d2e65
m: remove dead imports
chesslogic Nov 17, 2024
757fe4d
How is create_item_with_correct_settings different from create_item i…
chesslogic Nov 19, 2024
1a14cb9
outdated and unused comments
chesslogic Nov 19, 2024
59dc300
Move some option comments into hidden documentation
chesslogic Nov 19, 2024
d914f97
relative import in tests
chesslogic Nov 19, 2024
0de7ba0
m: extremely minor example yaml tweaks
chesslogic Nov 19, 2024
1a19189
remove dated code and docs
chesslogic Nov 19, 2024
5fd05a4
Initial Review/Lookthrough (#1)
Exempt-Medic Nov 19, 2024
de9de42
partial conversion to use self=cmworld in rules
chesslogic Nov 20, 2024
1ef3be1
refactor set_rules to self
chesslogic Nov 21, 2024
bdae597
early len in difficulty
chesslogic Nov 21, 2024
77e45ba
fix order of cast()
chesslogic Nov 22, 2024
2b365b3
remove criticism of progression balancing
chesslogic Nov 22, 2024
689005e
Merge branch 'main' of https://github.com/ArchipelagoMW/Archipelago i…
chesslogic Nov 22, 2024
18538dd
replace self with world in non class method
chesslogic Nov 22, 2024
43cb363
Merge branch 'main' into checks_mate
chesslogic Dec 7, 2024
e14d6f1
Merge branch 'main' into checks_mate
chesslogic Dec 21, 2024
e8509d1
inform player of deathlink setting
chesslogic Dec 22, 2024
9c91903
lower logic requirement for small board locations
chesslogic Dec 22, 2024
c1f53b7
difficulty adjustment - capturing rooks is not easier than 2 pieces
chesslogic Dec 22, 2024
625d2df
bump up series, queen, fork difficulty
chesslogic Dec 22, 2024
d9feb88
start refactoring out itempool and collectionstate
chesslogic Dec 22, 2024
e1e9459
tests should be able to run...
chesslogic Dec 22, 2024
292a87a
continue to enhance tests
chesslogic Dec 22, 2024
9a646ba
fix filler generation tests
chesslogic Dec 22, 2024
7ddfd34
fix Configure in tests
chesslogic Dec 22, 2024
d0d9739
dumb little hack to avoid importing every option
chesslogic Dec 22, 2024
0e67933
tests pass! mostly
chesslogic Dec 22, 2024
08348f7
some funky remove logic
chesslogic Dec 22, 2024
ea2228b
fix circular import
chesslogic Dec 22, 2024
bcc9fe7
FIX rare infinite loop during gen - use actual major piece limit if q…
chesslogic Dec 22, 2024
b9e7f03
simplify separate calculation of locked item material
chesslogic Dec 22, 2024
747f0b7
Naming cleanup on should_remove
chesslogic Dec 23, 2024
71f8919
a minor distribution fix to add more queens if many pawns
chesslogic Dec 23, 2024
0975b0f
curious if this breaks logic
chesslogic Dec 23, 2024
311d7a1
yea that was bad
chesslogic Dec 23, 2024
b2d6a98
fix material range in tests
chesslogic Dec 23, 2024
921b4de
move more stuff out of CMWorld
chesslogic Dec 23, 2024
d4e27b6
remove very old, redundant infinite loop fix
chesslogic Dec 23, 2024
d514842
the tests started passing so I guess I fixed something
chesslogic Dec 23, 2024
a78f3b2
m: fix import
chesslogic Dec 23, 2024
7e01833
it was an issue with my test lmao
chesslogic Dec 23, 2024
e6d5f39
add individual unit tests
chesslogic Dec 23, 2024
b639c75
retreat to CMMockTestCase for simpler mock worlds
chesslogic Dec 23, 2024
1e9785d
fix a miscount of locked items
chesslogic Dec 23, 2024
8db7c3b
refactor piece limit children computation
chesslogic Dec 23, 2024
e763b35
fix test rook children
chesslogic Dec 23, 2024
0e73819
finish this round of testing
chesslogic Dec 23, 2024
94f3603
rename ItemUtils
chesslogic Dec 23, 2024
82dab14
and now the tests fail!!
chesslogic Dec 23, 2024
9a9852b
all imports now function
chesslogic Dec 23, 2024
cfa08e3
re-add starter items like victory, lol
chesslogic Dec 23, 2024
1b21415
Improvement to rules format
chesslogic Dec 23, 2024
e01f932
extract PieceLimitCascade enum
chesslogic Dec 23, 2024
65f9a2c
remove dumb little Callable
chesslogic Dec 23, 2024
17d7acb
UT castling support, and require 2 rooks again
chesslogic Dec 23, 2024
789e7e7
fix locked items and collect
chesslogic Dec 23, 2024
3e0c03a
fix the castling issue! not counting all material for some reason but…
chesslogic Dec 23, 2024
069d2fd
flip remove, work on locations off by 1
chesslogic Dec 23, 2024
61ac819
move wrapping method into itempool
chesslogic Dec 23, 2024
67a6220
maybe I should just add locked material to current material
chesslogic Dec 23, 2024
e8f99e1
handle play as white adding material to pool
chesslogic Dec 23, 2024
d732b3c
getting ever closer to a once-again-correct collect/remove
chesslogic Dec 23, 2024
7086591
refactor completed
chesslogic Dec 23, 2024
f17fb81
Now, I can finally make collect/remove less complex!!!
chesslogic Dec 23, 2024
4abcf7b
m: remove irrelevant comment
chesslogic Dec 23, 2024
e53d747
m: add a description in CollectionState
chesslogic Dec 23, 2024
b2b4718
Remove queens less eagerly
chesslogic Dec 23, 2024
1f597db
Move item removal into a separate file to better communicate intention
chesslogic Dec 23, 2024
6f0e4b1
upversion
chesslogic Dec 23, 2024
36ceab9
m: call attention to one itsy bitsy impossible situation
chesslogic Dec 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
rename king locations, add a test
chesslogic committed Dec 7, 2023
commit 939d62dac8d9492f397c7ed795c9550befa82c49
10 changes: 5 additions & 5 deletions worlds/checksmate/Locations.py
Original file line number Diff line number Diff line change
@@ -40,11 +40,11 @@ class CMLocationData(NamedTuple):
"Capture Piece H": CMLocationData(4_902_009, 1240), # rook
# some first locations
# for strategic analysis see: https://en.wikipedia.org/wiki/Bongcloud_Attack
"Bongcloud Once": CMLocationData(4_902_015, 0),
"Bongcloud Center": CMLocationData(4_902_016, 50),
"Bongcloud A File": CMLocationData(4_902_017, 70),
"Bongcloud Capture": CMLocationData(4_902_018, 150),
"Bongcloud Promotion": CMLocationData(4_902_019, 1950), # requires reaching a rather late-game state
"King to E2/E7 Early": CMLocationData(4_902_015, 0),
"King to Center": CMLocationData(4_902_016, 50),
"King to A File": CMLocationData(4_902_017, 0),
"King Captures Anything": CMLocationData(4_902_018, 150),
"King to Back Rank": CMLocationData(4_902_019, 1950), # requires reaching a rather late-game state
# capture series of pieces and pawns within 1 game
"Capture 2 Pawns": CMLocationData(4_902_020, 550),
"Capture 3 Pawns": CMLocationData(4_902_021, 950),
2 changes: 1 addition & 1 deletion worlds/checksmate/__init__.py
Original file line number Diff line number Diff line change
@@ -35,7 +35,7 @@ class CMWorld(World):
game: ClassVar[str] = "ChecksMate"
data_version = 0
web = CMWeb()
required_client_version = (0, 4, 4)
required_client_version = (0, 0, 2)
options_dataclass: ClassVar[Type[PerGameCommonOptions]] = CMOptions
options: CMOptions

17 changes: 16 additions & 1 deletion worlds/checksmate/test/TestMaterialState.py
Original file line number Diff line number Diff line change
@@ -20,7 +20,7 @@ class TestSimpleMaterial(MaterialStateTestBase):
If this fails, it's not necessarily the fault of collect(), it might be that the generator isn't adding enough items
"""
def test_no_options(self):
self.assertLessEqual(3950, self.multiworld.state.prog_items[self.player]["Material"])
self.assertLessEqual(4150, self.multiworld.state.prog_items[self.player]["Material"])


class TestCyclicMaterial(MaterialStateTestBase):
@@ -39,3 +39,18 @@ def test_no_options(self):

self.assertEqual(past_material, self.multiworld.state.prog_items[self.player]["Material"])

"""Same as before, but backward, to test "children" logic"""
def test_no_options(self):
past_material = self.multiworld.state.prog_items[self.player]["Material"]
self.assertEqual(past_material, self.multiworld.state.prog_items[self.player]["Material"])
self.assertLessEqual(3950, past_material)

for item in list(list(self.multiworld.state.prog_items[self.player].keys()).reverse()):
self.remove_by_name(item)
# self.assertEqual(0, self.multiworld.state.prog_items[self.player])
self.assertEqual(0, self.multiworld.state.prog_items[self.player]["Progressive Pawn"])
self.assertEqual(0, self.multiworld.state.prog_items[self.player]["Material"])
self.collect_all_but("Progressive Pocket Gems", self.multiworld.state)

self.assertEqual(past_material, self.multiworld.state.prog_items[self.player]["Material"])