From 298aa9827fdaa6e4c5ff1569ba68c02df4319018 Mon Sep 17 00:00:00 2001 From: ghidragon <106987263+ghidragon@users.noreply.github.com> Date: Mon, 6 Oct 2025 15:10:13 -0400 Subject: [PATCH] GP-5806 added namespace chooser to add/edit label/function dialog --- Ghidra/Features/Base/certification.manifest | 1 + .../images/UnionEditorPacked.png | Bin 34640 -> 17174 bytes .../help/topics/LabelMgrPlugin/Labels.htm | 89 +++++--- .../topics/LabelMgrPlugin/images/AddLabel.png | Bin 12687 -> 9085 bytes .../LabelMgrPlugin/images/ChooseNamespace.png | Bin 0 -> 6276 bytes .../images/EditFieldNameDialog.png | Bin 6566 -> 5750 bytes .../images/LabelHistoryInputDialog.png | Bin 6616 -> 6329 bytes .../topics/LabelMgrPlugin/images/SetLabel.png | Bin 7523 -> 6345 bytes .../images/ShowLabelHistory.png | Bin 15676 -> 9795 bytes .../java/ghidra/app/util/AddEditDialog.java | 126 ++++++++---- .../java/ghidra/app/util/NamespaceCache.java | 59 ++++++ .../app/util/NamespaceChooserDialog.java | 123 +++++++++++ .../app/util/NamespaceDropDownModel.java | 193 ++++++++++++++++++ ...AddEditDialogWithNamespaceChooserTest.java | 192 +++++++++++++++++ .../plugin/core/label/AddEditDialoglTest.java | 91 +++------ .../ghidra/app/util/NamespaceCacheTest.java | 126 ++++++++++++ .../java/ghidra/util/datastruct/LRUSet.java | 15 +- .../DataTypeEditorsScreenShots.java | 12 -- .../screenshot/LabelMgrPluginScreenShots.java | 19 +- 19 files changed, 887 insertions(+), 159 deletions(-) create mode 100644 Ghidra/Features/Base/src/main/help/help/topics/LabelMgrPlugin/images/ChooseNamespace.png create mode 100644 Ghidra/Features/Base/src/main/java/ghidra/app/util/NamespaceCache.java create mode 100644 Ghidra/Features/Base/src/main/java/ghidra/app/util/NamespaceChooserDialog.java create mode 100644 Ghidra/Features/Base/src/main/java/ghidra/app/util/NamespaceDropDownModel.java create mode 100644 Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/label/AddEditDialogWithNamespaceChooserTest.java create mode 100644 Ghidra/Features/Base/src/test/java/ghidra/app/util/NamespaceCacheTest.java diff --git a/Ghidra/Features/Base/certification.manifest b/Ghidra/Features/Base/certification.manifest index 74fa75a598..a9b0a2613b 100644 --- a/Ghidra/Features/Base/certification.manifest +++ b/Ghidra/Features/Base/certification.manifest @@ -516,6 +516,7 @@ src/main/help/help/topics/Intro/images/Simple_err_dialog.png||GHIDRA||||END| src/main/help/help/topics/LabelMgrPlugin/FieldNames.htm||GHIDRA||||END| src/main/help/help/topics/LabelMgrPlugin/Labels.htm||GHIDRA||||END| src/main/help/help/topics/LabelMgrPlugin/images/AddLabel.png||GHIDRA||||END| +src/main/help/help/topics/LabelMgrPlugin/images/ChooseNamespace.png||GHIDRA||||END| src/main/help/help/topics/LabelMgrPlugin/images/EditFieldNameDialog.png||GHIDRA||||END| src/main/help/help/topics/LabelMgrPlugin/images/LabelHistoryInputDialog.png||GHIDRA||||END| src/main/help/help/topics/LabelMgrPlugin/images/SetLabel.png||GHIDRA||||END| diff --git a/Ghidra/Features/Base/src/main/help/help/topics/DataTypeEditors/images/UnionEditorPacked.png b/Ghidra/Features/Base/src/main/help/help/topics/DataTypeEditors/images/UnionEditorPacked.png index 66b0cecfdbdde573a87eb92d54a8b1b7b043d574..4a9fc8d11751e63f01f9372f328c2ecb24c2eda3 100644 GIT binary patch literal 17174 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 V9YLSk&2!+NysWZJ$zv10{|j4_yU73m diff --git a/Ghidra/Features/Base/src/main/help/help/topics/LabelMgrPlugin/Labels.htm b/Ghidra/Features/Base/src/main/help/help/topics/LabelMgrPlugin/Labels.htm index a619434162..afb0bfa9bd 100644 --- a/Ghidra/Features/Base/src/main/help/help/topics/LabelMgrPlugin/Labels.htm +++ b/Ghidra/Features/Base/src/main/help/help/topics/LabelMgrPlugin/Labels.htm @@ -137,8 +137,6 @@

Enter Label

-
    -
  • Text field for entering the name of the label. A combo box is included which allows selecting recently used label names. @@ -150,35 +148,36 @@ For example, the following string denotes a full namespace path that starts at the Global namespace and ends at the label name myLabel:
    - -
    -    Global::foo::bar::myLabel
    -       
    -
    +
    +		Global::foo::bar::myLabel
    +		       
    +		
    The namespace in the Namespace combo box will be used as the parent namespace for the label name and any included namespaces. However, if the you provide a namespace path that starts with Global, then the value of the Namespace combo box will be ignored. -
  • -

Namespace

-
    -
  • The defining scope of the label. The available namespaces are based upon the current - address. When editing a label, the available namespaces are not necessarily those in the - namespace hierarchy in which the label is located, but rather are those based upon the - address of that label. The Global namespace is always included by default, as well - as the parent namespace of the current label, if one is being edited.
  • -
+

The containing namespace for the label or function.

+

The applicable namespaces are based upon the current address and symbol type. + The namespace combobox + will initially be populated with the most obvious choices for that location, as well + any recently chosen namespaces.

+

Next to the combobox, there is a browse button which can be pressed to bring up the + Namespace Chooser Dialog. From this chooser dialog, + any namespace in the program can be selected. However, not all namespaces are applicable + to all locations. For example, you can't put a function into another function's namespace. + If the namespace is not applicable to the current location, the selected namespace will + still appear in the namespace field, but you will get an error when the OK button is + pressed.

-

Note:This field is disabled, if there is a - function with a default name at this address. The namespace will stay set to the parent - namespace of the function and the label name you enter will become the new function - name.
+

Note:This field is disabled when the namespace + at that location can't be changed. For example, parameters and local variables can only + have the enclosing function as its namespace.

@@ -186,38 +185,66 @@

Entry Point

-
    -
  • Sets the entry point property for address associated with this label. Setting this + Sets the entry point property for address associated with this label. Setting this property on one symbol, changes it for all symbols at the same address.
  • -
+

Primary

-
    -
  • Sets the primary property for this symbol. If there is only one symbol at this + Sets the primary property for this symbol. If there is only one symbol at this address, the checkbox will be selected and disabled, since it must be primary. Whenever the checkbox is selected, it will be disabled because the only way to make a symbol become non-primary is to select another symbol at the same address and make it primary. This ensures that there will always be one label that is primary. If there is a function at this address and you add a new label, the checkbox will be enabled such that if you select the checkbox, the function is renamed to the new label that you entered.  The - function symbol must always be the primary symbol.
  • -
+ function symbol must always be the primary symbol. +

Pinned

-
    -
  • Sets the label to pinned. A pinned label will not move if the image base is changed + Sets the label to pinned. A pinned label will not move if the image base is changed or a memory block is moved. A label that is not pinned, will move with the code or data if a memory block is moved or the image base is changed. Also, a pinned label will not be removed if the memory block that contains it is removed. Only code, - data, or function labels may be pinned.
  • -
+ data, or function labels may be pinned.
+

Namespace Chooser Dialog

+
+ +

The Namespace Chooser Dialog allows you to choose namespaces that have been defined + in the current program. It presents a drop-down text field where you can begin typing + the name of a namespace and a drop-down window will appear showing a list of + all namespaces that match the typed text.

+ + +


+ Namespace Chooser Dialog

+ +

There are several modes that determine how the typed text is used to match against all + program namespaces. The mode can be changed by pressing on the symbol(s) shown on the far + right of the text field. You can also change the search mode using Ctrl Down and + Ctrl Up to change the mode forward and backward, respectively. Regardless of the mode, + the searches are not case sensitive.

+

These modes are:

+ +
    +
  • Starts With ^ - In this mode, the typed text will match all namespaces that + have a base name (not path) that starts with the typed text.
  • +
  • Contains () - In this mode, the typed text will match all namespaces that + have the typed text anywhere in its full namespace path.
  • +
  • Wildcard *? - In this mode, the typed text may contain wildcard characters + which will be used to create a pattern for matching against the full namespace path. The + wildcard char '*' will match 0 or more characters, while the wildcard char '?' will match any + single character.
  • +
+ +
+

Set Label Dialog

diff --git a/Ghidra/Features/Base/src/main/help/help/topics/LabelMgrPlugin/images/AddLabel.png b/Ghidra/Features/Base/src/main/help/help/topics/LabelMgrPlugin/images/AddLabel.png index b95e614926aaebaa957cb584c04a174cb69b6f10..f3cec4d538cc4648ba39d4f6205c1aab345e4511 100644 GIT binary patch literal 9085 zcmb_?cT`hb(|1%XsE9NX0tkXg5fFhyq)BfA(z#$jx|9Sdp%)dTO79)1q4z{eKv8<{ zB|sDiO$i;8mha&8KJW9bXRY@u>&+iIXYH9Yd&+P2p4sPwJXKeuxXgGN1OibgE6Hhr zKxe6e``t@tf&b9gVTT|PyPUF|w2r&+S~|JCu71jriRv9Si~={Z&?qILz98R9I5wil zDmSH2M?c@FG;Rd8y1J4abzZA5K!V(qThf^BoS?iAHbXMd-j5-ozudbGVeio|Y0Nra_ll25Ml zQb*>A&B7=;oivUoZCCq|w&UWIR(HIi$*h;&yr33zB1}p;UsFA%yu1?6lrEr-^gYbiY!N0HcL$@H+?pm)G+tVz#buQ?`V z7&&xJ^hXwRa&)p!e(S4v*+eGihHS-qss*3DuFhH(I>+&Lr5rg<)YEJ0VTE7n9==nX zcj~XxuH&7D83;8Fd$tD1_1nC4y6_}w6o1yo%<7yESr@z>T+Uu9_XceSU<@)sL-gaLzQfQVJ^ZPFRQhy zmM7p(3}N}u?PK#ovvY68{%jYw?4G=gRyZr$?HIxs(WZ$NuT>^O=)8WS z>&^82&f3sJ%BJJhS!jEo$=UQ^1LCX5pO|qyz|SCKh7a!s#>G&6nvr1{TXIWo6+c+ z`=bpkJHFF1#b=TSb0tJP3`z>pnG5vP={%jNJD)9%Lw6)DdpFnPTI z*ZEk}syIY)<4zuO=x>eFXT&DjZp@i4a+rbFpG=flv0ztwZe1w%5VXvj4sz|8PHS35 z@!LLtch{ut&q}e{(2N-`N9zvoNa!Qz@J!XB@K03foNhU@g#adyk3Bjn< z@sA!sgpZFb7kv(A_QkH5sQCFU`8zb>JioT2nq%s-nb2b1KdWLHy04W^`_}Krm1;@L znN+UnEQR1;m0o(UtHRUL3$(55V{hK~>i_sFNZT4t@Axf$URHAAPWT-o^_?_y`%Lt& z&_Pb4APS)IkwVz;fFJGM;!V!4f&Qx0~dTh;KY0ox+X zdvROOX7Y1lx~E&w(%a>SR$(PCF`W$-Ji7@t&_|?Q)9-{cGYux+QH=tK9Z^C8;yA;3 zyn7wZ*l385?jeu8AIQh6i5}$PQ}mvj7ifwpU$JoWDk4*clF z`4DVu6mYsKZWDanPO9F#@6gF=HOYOspI{>!snU0|vQbX=2p+_be$t!Z?zURyngbzn zHSLUIFFMhCe5+0!8*Zyjbt__teq^V3(30axT^X)EkLj$*(Muyje78rzZn*~?>E@c9 z1Xp$_is5pkk2j$kN9RUV>y;d^J7|ImVU&*tIb3;%Az(X~dVBf&8Lu>ubK% zVFyoU40X+QV4Q0%t$nesJh-UpC~chE)-dJ)q)7~kiIb=DQk&h9A;shUNXNf492y1f z{oNFK+7=VgjB)JHzPg4!m(&_najna!>6mVb@@Yjk=4NHSzV||zotLLiR!;&5hZlQ9 zv)Zm1dp{FMPu_c3X#E3>sdsro^ayb*Hiz;4m9U)C*v;RSl(sEVb-8s#h<=^Q=cvl( zc!_C5dpF5=8OGpdYFXQRZbSV$-EK@5*LOxcF|(PB`OJ=0Y)S@uF<;_XVVFrr>ASiS zSR0&nsmwEA#Ap3VC266+Bo5yzz!OUsi|Lv1qKwFBcG|24mJFqM%-*5ZV%y-P^{(c5 z?1#anxI-R6q%!!Sv)4h3`GIh(kV47BQhW1(BeUHAHiYBmlzx|x92IOb&|+1y)?U__ zn$Cd&#({WWB9kHX2u51NS(8>ANNZ9&xTm)?Lf|g2BlAiM2_8}NjToA-ARR3i&hmRj zMRnt`MlyAC1WzB2=V*TA^mar^kz??+oU!g1Vn@974#(}T-l`{J-X6+b)5rd^c<#va z?DVuM<429=wii6Y_R<;&3vcb5c*m`NPLYcctQJ@2FhWqJ^eN;5J2r=9c%Mv-z~cWX zU9x)b`@!h?@i{G*5g)r|n_FGSDIc??_OoB_wEN6e zvJCGjO|A)9cBkzs7TMbW45tEfmZFS1xr?uLU@L@kWolJS)>sOBMTh8b#cr{A>h(z% zw%UG}4(YDZI_~#9$}?mte88+&PCDwwB{rktQY}Rw$P-FR+akw}9qV#Rm~+-bmEkIo z(@l@K6tnkxu*A*_rSVB7ahkK1^p*oHIa&vVIjYTJJG%5XM4a~blNUU7A=eBU>`Z$# zoj^8Me%KHQFZc6|*?sJZA_)+$Ag<)F{rsL1-(?1jOJ>8!nxdZHyv|jHGC_=fX@!pS zByznFN075{UKxw!7D9LThBsOot8}{V^J-A9qCESzepL2}5{U5SA)2kBFn;>fXHKVa zUwET~W?OUPw2xi7N?_R1oys1`)y4e@yKPVe>1ez8du8c?KliVLX!7(6DE<)ah-6@>!%poVxkef^WgX5V9Mxb5V}@0kk_O zQ#546(PMU9YUyd_q`X9dy@bcNFeA+ROue&4{nlQFzEDrM*um7muGT@`jNbuTq@iC$ zc9xFXDUr{?3!6jy>+J)Nsg@j~4p9)boS>WaJ@G?CPZlxjV*li*)6=p>q22-t?KqsR z+Xt?~D-m72Hj{)^#j=c8Xg63y=}EF1Y7M1^wIVtQKF^E0zv2V$sD}nRa7iB4J#k1X@puT%W(7kkI^APV{d_yr!IkbdJ3t_C@ zt7)#iDB*Gi4z3z0r^Kj!kFL1d5JpdG7+e@DP_k} zw2w_Y7~L$V-_i*QDPn~j3q;_DJ-x&xIi{xU+!>U2^0#zy+>Bj`JSjdCR!(aa&#O1K z5kF$@RyaC8zc;5^o?q_hwR_o(u^D#NxY^QTMSZ-{a^ZpVKF)T75vh~TY47(=v=uT$ zpXpxR2C*uo!l8WqIh-vPb&TH7l4gbWJu)G3`e?RfPaQto&8E4Uh_dA3_M;!kg!Ih6 ze(Fb?oaoAl=N#5ZXOq@R!+H#D+ubLyVn-<(iLczwI@AhNE#_nUkOMVbSq3E6snaK+ zvG5-5MRE#Ecbkh3TewY0X=FU7J_NN(tzSO0g6l$E!21$46x`Qm?jj_OT}QpAl2UxW z)_$s!;6$)UHa}foo+&viD&ye~l%MTcee$-%qwvu{4u>NC`EC5+*DR)q&;8$*#E%-A zd=#2^U6~q2nP>fsH;ov;c}?CvBrvx!fOag@$C^YbZdRUr_#lDV@WeD^`fi`0_B|nQ z_YJdl!PJXD#U@~9w9aj0p-k{@7r^0F5y|PyK$%)(d`&c3f5^$gs_-FP0X_oFec*4f zSf>cht$Mf>#a64pkim%aLsVLVx1Qfs<%=+?9RK9`xRe(+;yKeE{80|LeMC z98;awBOj~vTi6l`gJfF7aNY+mP^GsxV{@L^vX|-nG;%e$)^1_W zf2;%VL>Cojt6uI(gTsUV|i#{j|d=R;}#=eN+ zc=!5BgyAhM=11FqbxVtig$i^w?Dr^+6K-_+PTfSS+h)hnO~w`R>3$Xqp&j5gnN3h6 zOD^iF2ydCse1_fJIJaLGdu3s<_+T4vxuqJiDsqih;A`MxI$FY| z=21^Pv^(Fgnn$rYsm{W?h?T1QJ|~2=hW#SHhXpez3jZ6K8==GvAX0g+Y~`c&kG{)} zH)MEx0&1QqdoaX zwfFcV5u#!m_>v>TdlHp)@|U#JBPHXs>?QQ$CqADlMuj zB6VXz(76~H-aGTMWIK1JG^jM8cfGmX)7pOa<1fY1JYP4NCNza8noA(yS)Ob{LJdo@ z{`T5O2Vm3Q8XPqO3broxHw`A+C>Dpl2nHkQnn0|4EPCO?`f_gQrd_cgpX@QmXrH;h zZN_~)H>PU&CPOLZJAWs2)lOWfs=4p+?nXgTpu&TpiyiFpm=a;C%tIe=WvE}nPod3s z^!dj>-Ol^5MQjPcFDz>+gSodO8=oJwNPmw8Ulb6%gGt_sJ8lO`$;t!52$S-6=u*~> zYkHN@6tI$Gl>XvQ1yOR|zWLN#D);b@la@l1)tsCi=As<3HL zoKo`B9bg+w71R2rPLQ}j-Z|LLDjUZIMLgJ6Jy(s3=(<(2>`pt#JZr5N?O_a8KwPH2 z*u&=w4?b9XZ7-@QVtp`2QoZujvLBaLQX*}(xrg$zF|-kh(t@rp&@9z!Y?JEl8j*LE^^Wxr9<1&J>- zYISMFE+|bO8!FPds{a**W*@_&etI5l9ZTeU7!O;7g?tx4;c++blP0c+G-C!WRbB&~ z@&PuSu0cxkpHx&banfo<$sd+kh*x_&0hiXOrS5N`O^)q4@h-(jrJ<6R&7Q=%V0G5u zHkxyb%n35nc6!k`I@KK?QWiR#U)!~TT&`sv*jnO!J!M%k5aZ&Tjp=oo(;aG8=w?N= z=~?J+txCcpQ!@jilZ_sk!fKrxMJg-s(>aJ>eryc;Z^$SaxyZBzpZAhVlF)ZhIhrFK z*AMUF(ai@X;?_z^vi9c710DEdRXd?@))d8^4CG@((<6;3f-BW7tro#(M0~SDNSaiq zI33U)e2`R~{8ro+)yzswJH#tmtH^*BeEH4M!G)=EHQCQcrDX0`Omp1NAR52fy~S$M zw*o($*CNZ`M>;ZWlr+N-A12x%JHj|R{Cqq48`ev=Rm5w;i7>HLyfXWxH>|-~*Sk^Z z@S>t3u!(V^0XYct6ud@tH-dR{qAlmv;RO%~71{~mIRgUOeuRKPtYj0wPyh%A0=>Ha z91H?oKWl#u1d@3L2Z0`6is^vdjt=INzhf^6di>xOoQxWB3&hHxlna+*`tfdRB>Cyx z_g0tUpD{@O9pHUy-w={Q;b^aj1M_^Lb+ICM+$m3Y@+s$t0ORert{7{Bzk zJF>W&Hk=kvW|4d{5W{5j%gXR6uBEtPcvWEnZ3`&F`3Y_M9?8pBkANH2E64Gx4Tzf} z0sbc+fJrC>#|Xjx&|VG{Z-U2@nHCk`AW&_-io#i&CRhK0%Xu|$P8s>o8Bk1en&-3&Kj#|&vYdJF^qb*}{CbiKKd?`^@4zlMz`j$=)lxVX9Me1Kp8-A2d7qW_ z_0xP6rbOm9jruuw&VGza>Ug&AAVP`5Yz^=k?dC+FxbvxMo#)Zt$bopVUb6p80|fH% z^@+C6_pRH2z`pqiVF?r!0yMoIUtEruq+m&=RZEV&6NziBV$) zz;@|&2ZTk=r|+roZQOmjnQPSkE_`NyMbdJW;TM}SGalI7L%;8ReD_1WzA#ez)2Tth z2=JiIeH?226t{qR;;&EDe+_p(dn)fNZiDR9SUGbH#Yw|0z>~LGaHxF}v7JPH7dXMR zA4HK7f41@xhS6~mF#X#^IpAPccqPh=|G%OD0x9wQTY&%1`SBmjAvNJj6lE{CL7)Mb zQ>9tS$k7zXqtr+v^E(FhsaB!V^~DDDql8gxcHTJ<2VV$=qMC}sus;5lusEue(Ml}A z!g)BAMwlE(H*FL2H$Bs^tbnZEo5=Fz-ohsX93YUgJa!^*5-mpqW$Vfp(fe+dSh$R? zEsX7D(`&lH_v0$))k02_y{v=nAPy{#ftVLgNq3s=a@__!j?s=pzo&Juxi*wzpCWs2 zhWA3P?&r}NCT(FPkf@8DlYz53p<|_*nvmU>(01zZFNXD#c~izSbbQPpRvYD9xG)Q9 z3pjQ^bu)N%`4ZJ{dMP;(8mu|VZ;^Wn>{bUmdfhvU{!Jx05?AHb{4kp8*&*bOFjRzoIbHhu$WnAsF=h>rdms0*p~N+6Ih`kzNar8(edG*?@jBs#5!yavjzPDn z9v^3)(}ylLFv#|Zsa!S|C=24$IsoTR<~mvSD|Xj5t|lb2$$S?&dWC=@Fy$T^-& z2^#qN0e=qjFE*RAXw6+zR`IL>Peby$ZX+xKg(GtQZ=P$iXTO1J1rYSwXkT^|XhX>X zBn?ahB2b2>+TO%fNK%~zy&{|Y6RM&6r%>As`opf=i2mfae-89QM|kgdUS9;g5Ep(; zy5qaOsOA{a($WIF5PI<51)_aP|v^ zHJ2+fj}<4M#3A5qD7zl*b08(dA9Dt>&(Nl-ktH(bs|tEwt!ROLFSyAjd=yAiI$&qK z%C!~0YYIl|_~%_beeBIvX>Zmy&dLQ4h=X$Ww#noxwCUK+Q+Tb7NVY@UgK5Sqpr{4+ zFmFrQ$v`b(MQquyM}k4 zrhoKxorOwZU)=bgyoPi3=cy)cZEugu$y0OmvLx?3Yx4G3pT&yh+$N8)inP~y`S#;H z6)NXb zZP|BZbRPCOo$Twb#boY|VQ)_Q0~vWgW%mUv2TbYT`y!=GD>Z@j+7G4UU0`V(N`y2) z^c>9DHT8o>jr_zreWYpMgo>jF7eWfS3{+fN7LAfV(`W_GWq#T{*Sa!X&?*Gz>o(sO zu40m6Ll=%0rFMGDv2Z6W`YxJ1Sp8{qJ0wM%ocl7TioT`H(z2Si*fbv)@N8x5iv2NvZF}J10`-m3W3H`Tcjr19jPr0WeFEEbEFJksD%v<)&6wnlHw8&(8sr- zN`56M`1&@9+tSk08`*H`<&CAzI<1fT57oR_ne{Gamdh@??ncOI6h^LA*1R_*2SB3` zdp9Hd`R`(mh%khe-L!Q>a*9K`D8C4OxqJEYFQdaebl=E&wlO(5sb6l49DWj~`{Kz=M`$6@D7AKx;$|70{yud-otfFH9=j`$ zMH>hi*}svbAuj((i&lF58|#eLGZ@s<(uPRgQgnxwG8XyPa-RR0dsu0Cx^FDq7ElWK&n@DmQrIJn#XamWA7o3oqm zW*XeU$CNhLaW_r;i|rb-6Av0>%)D(H%N?Q+gvaNoe?z)IrTy5FfA>Uqus%K?tT~h& z9J&k}TTrQCEJIL`cdO5jA9r^*#;m#f@pxQq)X-hTC?i{PzT)}ULFU`(bN^^ za^c7*=V+mr?JAAhs;b``Qwa)%%Bo{sx^2y|WSPnH7&LL=OPG!UW((pU^*38h&CWt+ z?EX65Z|6$28jC2sD7&b@q0X7JA0e#9Q{&>+X?1%a`IXde{6pd8CCnbpV!ifWaYm#? zrzQFnfzCV!Ul&-No#vNUV?t`}73%5TprxHC>^=Kmk}ATjK`=4fOSZ%Tc<_T7J+;fEf4#W4n9l=?I91}=Q=k0IxAFD?Mm!~n__^x#z> zj=#Np(qN(;L?T{%e;U}ICUa_xCy5UO&f{LW*Lf7n@Ypw`SVt^UIq^FwI2oUYQ15pg z-HG*(c9!mw?^EjQmehR(`tLG@Z0f@4mndZC(WjSyU_&$;`1ErXDhZaqDPL}qZe{A2 Vr*~vBSpvuh`V4isGMVRZ{uk`dU912A literal 12687 zcmbt*WmFv9wrvtZumqQ2!Ge3^5Fj|g-5t7d2<{NvLvR}RAi>?;-Q5}s4#E9ZzVpr< z_r5XCk2~HEit6rBRa@4cbFR5|g(}ENyhA2He(~bPyDyTWN-ti#WCQ+QAie^=QJ8)M z{J^UAMN~+|RqrSbNd;SC?s_6;?7rc(BDM~um?CF!@VUA4_xG>13VDr_#v$?x$Mc4o&!Ifmv79)6z{iIYy>$@uzb-UT$zX*kJ^LK)3Hz3LQ}7j%8I72(cWDSMDsa1cxg35&Zo{UgtrTni8BC zsd%Zlx#u(BP*E}BAX1DVia|!$Ps1mQrrV^B^>uV1^BwK-R7*{+N{2is_Xqtb1j@+t7)0(ZpfsZ_0vu`2em_G zl}_;0F~5me!bjh_g8@YZ@5`t2#dqe>(;8Ki^-9G`l>|-hv|q<;`))qKkZ(>FZnmrU z);xEekEM_^^68kYH`dJ0JUHvg&ilZGOx?NX=2Dvrb4uTzYTF(x?ho;*&rP>@qIv{n zGOo6ZF7E^J&=dJj3lirrC{Ko(3>5O@$S zbVRXGb+$74#V?V`V=Y1nUbtV@5?#6-D{W2aYYr^ujNE^bO8asv2D~bK>8eNdCn zSa+7uh`XHI&dT5M80`r!>P}lSwXtxZC{!iVY;C8Ihmg;>kV zma(x>OyzwUrMt7z8Zy*KbvPe+p!p%^{^Ial)+&hn$#nip>Wb4zgC#zzvWy*53X+J& zCBb2gujNPl!zKgXIXfSks$WR4IN=&pL-O#wp;&+C&&c`eQ1h4Wg4IAmWdyg)jwl9Z zZcWm=$4BK~x=;oWu_t4hR2pHwYPI-7Ew$tvr)z6dqg*i|1fNTYspefrQHqij4nMlzF9(`FRREG^Jzv0tATEH*;!u(2h?;1G14UwC;lia$Dc$HzTlHruV7;nq})-iaA%4^gx-1hsBUf{z|WSF1R2}T04Zh#xh|O z*BQPP3}zsH*r*4uTEL=xmm0MjAf)Ngo?iGNnW*ID5y#^l$IRNnWms z>s&#Y5?t-@o=uI0YuXy^R6~N3Y$5n!zj$7|(hbv(h*io^23n3m5lvdsGdwmHwfBRT zElA|OkY6=!mCY(-UV~1pTrriZ?5&E%M=pon#mv7eOttdY@HB~si+=6BiHb@0_UTYL z{RC2oKF@h^Xz0M4jW)B+TirH;PY;^(QRHrCq(eybXr|!&XFErFzf!(tX5ElcZ1(r( zeKxT+a3WZf0j6K1-yYA5Y=wi{^g<&}?|SfYfAzLfYG&<-E1$MheE${*sVF~cb-i3 zbp~`9*OAD@oT(oUm*y+0e*oVe@@jh@#wA4$khdP>quigDLgjD;dgGu}gK@J)`Jte^ znk4gV8S@f4O^Ep5Bu0x&BlL83%Gpjze5Y(}5fr@bX$#&chq0uJkz5D(8)*IM5z>|Y z1eYWBP8{I~w8y*d=~+aR9-aPDTJ}qeJ7uPidaS;j1gWd%5qr2E%1sqRb>;g_dxZ&M zuGme(iapxGJ$zciw!8l9xu|}gX8XbScqEEdntS->VF^=8F`Mdg2RS{H-cYY zB9tJ4`?1(A5g<`2B!6Fzg!eAB{BC41#jbB~>h1zN1YxXs_w9iXnyJ9WW*wzNZMGc8 zljkZXy!ydwXEC+-C?T=R#kN>qWDEFz-rd8#cvr&YiM76_(5Rg!e%| zJt3^(ZBheSO*1Z2oVmP&;{D0@z1+Nf+PZO+y$o5!%Q7keGV7%pD5*Xgsj2+yBY+DI zc4SxHIjWDvNMS!nOH?U=c>Vg&-)VQ=vEH6Z8koj|MU)VejBDTDRUck)9^|h$fziaj z)0NRW9Zo5)wI3KZ;G+kHn0%VGb8vO^EAJTk>HOa1xZ?gd?W{rj-nY}=-BtI?k$l%Y zUwJ?Be(JWKHK@KC8jzM0fSuty+!j0Qhkl=LGbDR>7d%F-_wK{uLj71Ac(+Vc|7P=s zn_@GnZ7p=m-v&!i*YmS$Y4^O~og?Ry#fQKiu--U&1?f4#@Z$!5eZ()%EHStFJHw6e8r*M-G|rBtT7wS zDEa=nKj@_S+}|R{J>~fdCrCsAG7Ogx3k5zs_95@3A5F{-$_U>+IyTLtG~8d+R#s%_ zvBUmLB5_pLm2HoenU@wHUhlxiAUeIP^=m4RS@uCk+*Wr+{zXvNjO=Qg#Rn-qpHq&+ z=f;k&&qtlJ2L1Al?sgqXFAu+7#38w^Jb7@(pgpp8xesz>B)Y5zJLwJRP^kMwp|ZN` zu3S}-F!xfC{cdsW3=zAhzk1G)OGZlqhRapSbDm2lg#!1eFlmhAsn3^5d{#&i>5v76 zb`mu>#$j>H>&;LE%f{`LvoYjp-gwnZ{j(s9x+kz<2biVq<1BB_$XC#P1nXLoW7F{%X}8^Famyrl-jsY17fvv(0b+(!_j( zgw5RDJ;woFT+D3miHOK)Mt<2zw>xul3K7hW!c^*d(`X8fSQKSj$73*I#@U;>b|Z|m z0%~V1j-u5;XZzY#0Wizc0*$kG=!Ez^Jy?0FtKec8sELV5jUn&+pXli5fe}gIqdhyZ z)dQgHw;;TI-#<`LP{gL}9a13*L*nA&Y2!4-(F3dsGKYozNVi_n#*%I!{-=ZFqvB4B z$Mv7{^BzSU6c>cY}en_yJpugId4 zQ&ZN~));QjkJnK|Je_k+&dwjWY=~eB3k#i)_;eKN{neJH^z`)jcpN@OGU{3$haGNi z?rN)rO0WAXjW<>GlWZ{{Bxp_^=>GDcF4Xw>>5(DCqeZn?EtXoo)%A=#&cN8%-@wMk z=47>{FNy@sZEJg*>=k3=2Y!M-4h{}%AQ0?881nu5cMJ@SY-UItokQPuVqiQ({JVnQ zRaI3P3$af&I$2Uv{{%W>9J!J$7Jh$yf>$I!K^yynO^dF|xbHg!H)Je*#IJrX_$_{? zCmLE5r}ZL>etmM}_wTb46K59}CT$iA1&TS-(<*8%hw~K-5&=r!KlM#bgaia2lE~py zp4eL`6v`dl*4CE%w?8~UfATCaRu2d{t=cboJhMO*Nda=h!@~@NJa({vf>Ol1-NhP9 zJXkN0Fc_JzBiVT%hEgjvnslpOTNR?Bg6#;~-tIwloBl28&h*Qbkjv)q=;)o#NHT|1 zJTyAm7t3&>xCb9e7`53BESx|Cn{vP04-~mNq2aP!9Ud5%T~xOfO=_F8-JV6M#Aqrsr#)ghbarYb*$Q2$HD_|VV-A)axOEDLZ@P*APy+G>0I zw-Ngv%4@A&6>FArrNp?Yz}Vx>;E?g+CFCG3&d;-(Pm1d6`^*%nDv;h|_Qx#!cK$v7 z^5^W-)cM(&A*0G=#A`ByYQ=oqkJQvCZH^-&BeK%cSaIsm;bEECby-wyAV6G>muYEe z+8a*k2FsrCkzm$;65_s~i^h|JF$0Lm{`*0+roSO4S~Z@I{(SKW0a$a*j~9JDoT)zf zp+|@w_T*1z@xOwN6lrrT28SCTPYtGx_h<+DS2Z0@A5P#`pN|~3AbC6cDRqAwpKLME zm`p#ROG^vm#Dzv7^xJp%G5{I%YOQ#jJ7u$yZNF~`irbDm?0dNFhi-hug<(w&FbwO} zq~M(?Ej~Ve6==luE}P-pN1s^UZM$fsn(m0L!dY=1q6Q)v|I3 zmWNzLJDu?0N5rGTBGB`>4_ITCi8l_8c6(W|Zs{Y?!7Islx4Vly0k6AtRqWj}Ihw}_ zYC@&Ptea@G_#Yr7VGq&4x5&u*D^1t)6~<@C`WoGvu{Rc3*KIuD*+8DDF0SjJ#?L!w zNZE3vDiAX>8pzQ0P-2_=C34v*2F6xvFLgyV6YbQN$dWIG>3Q&LMQU_9EG0*Kdq0Ma z&6$OT2HUmP=iG$z-gxudiGm6J(nB^!sj6#7E(Ad>pSyHTTfUo;CFj&OvL8r?!HijH zjCbS(KW*!urk~3**{8gVlw)bRDCOjB9}hJA-Q6&1xl+yppqjhwu%z&)V!P=wxJQz1z*85XK@azX|t6Rw-A@Zt1P?g zr_Oh|MKW3=m`)hbQK$$N4~WcA5xJ#hE$<$ommkVFPvpnV9y(){BOYnpH@x7z(U2^o zM5Ty_L5I~O#l^+toq^Qmd<7K-GYRJ2Y;QMMdhg~@R-bUaF<#+w9wp#_0_|ZU?>m76 z4hG;uH3^|t5R^H6;dC3G>-VF6vb)~zn0p1PL`=h3^-Gjuc}}M^5o181je%wv_~_{E z&mQ?jf}E~PgWb**mSev2T(uyx=X5>#;aJ3d!q&C7Q{WWm6$b0tz$XdW{Daol9}o5j zy{oRUX=4lMCEH#WUD$rJ*kyiKo9a<{Je?L6-Djotiyf67 zN?zM2MF^L)YP{Q~&_eP$^=RLd$35kpk1QfAGOOWl7?xF%G~e-;IG%0jaJ4=2e7J_h z(F!mMHOGEN@h;5sHjme|*gM;rJi;R}Bo3F|Sv~DMjgT<%RTY&6$3#c75*|9wcsmUa zTYqu*G_$ar=HuPOwQ?(YTpE7OoG;j%!R*~098yFZ>x~c+A!Cx`({LU?hIRc-!tzPM z)biQ2n&aZEqBx5A@v=Zk6IbmEH1J}{&BO$A$$f8cd$_NVi=?QoIt7i4WW>j{)?$!h z3nB-s&#X`}B`g(9=xd>7cuDAMGKv4yp;~cgG>s1+DDsFyU@`sK9_mCCLZ1;L1ScmY z0Z{gljxH?f;&8zMz%xH=KhmPWgh8w6g6OTARI*iOl+= z$MG?1!N zFD@LlwY7D1SFYE5GV~emZ*Q}RU%z|%c5-s^W;TIA6SlrSUI~_F_nYAer{{NqKz0Dq z`ML@jNyaB6tje5pzzFahSAqg`kjn4je7-Y+g@uJe|8K?{8X5xVCMhkA7{$mhFl=We z1&@%>($MfF&pTpXZ0)H~Eb45I1UMdmI(hl{mHy)c! z|BEd}oEWvL>wTWRv%-{f7Mzb3kCy7tW|(ywyAkqs$q{ceTR>zlhFu@;F6mV&lAT;! zxY*fE1ghB$J74dNrSf1osC#=0Jn(y584Mv)^YUs*Nc2rju`w_((9j?jZv$l7?Q!wj z(At_95AV8B5w$uaGz2FEta%YK@UK)*{N96a-^uTM&4b6x94MmeWt$E z9N!k+hc5|(e?msm`8^Wkcl`eu&w>O{$8@1`McKi81%)yd=MRPGx;m~04$E1y(&2&v znu4C8q3|9tB0+B=Q_V(4T0ZRB1b~6VH2UcHIV^FN&D^Asr!&Gyw>~??yWL+|TM^jh zuz~MxZ-qXvva)KBppppasH-RDsTRq6Bb}V@yaeWjhll5@ri{GmE1lI)(MIZ z3ca|yJeb#G(kOp%FY~dOhr>C>*Vi|28393CjGiA)s6Tk0uIfk1I03s^dl|&q%8HcJ z%gakN6aPv!f@&}z`|j!}Tvs26yYkOsRfxh@&8CdzYd~=U|ei$K)`_^klwyN3H0u!u%iS#l4qp=_3hfr8aA6ThwJvAS$k+b!b;(s zg8>X!fB}nzMe@m2K^*;rZpt$(pV-}c>TD48cFz8OxY%rXHQO8^BRF4GD0PtrtBTTu z_Lxej*;wX`DIKQD-lJ`p5zmLb`GAaZk{#U?t|QNnW%-3;k%o>3-hT$D>D7Lr z$6<-$lwUL8A8T5jXnsm%y8Vr#x8cx%2|4v(ij4(nSDOLLZ$!fRc)75+ zSi2C^cDGM&S4~x3QRC{DwX;Qrz%f>pT3E>2jGa)G&pI^J%iCk zW?EceKy7uP8D3ZTj;;r@jJSJqWf}hdaLPM?WZ50d7^C)iyqqg7E&Y|C0_Ei71ag64 zKvv#o3i&4qx?h+9YFjKE7Z|v!-xCy{KBe}YpP#d?)tXPeQFg4eSwXk6x3`%6g@51D zoFfrc*;uSzwsUSbU!+P81i$0kE|oO_AJ1ZE{MFB@t3nRU<7z#KjCy$rNG7-g1THTw%6Y+q0qvQwKr_31ZcfQeVt@Q-w}>R- z0Y&()nHYHu6(dTI16TuE8yrN|N@g_{H!_0#AQL$}Jk)5G&kz9c@cQ!7>kKBQq=ZQ> zpZ>`(1LgX7<^KMpO;cAwLLwoGeE4X9=<6F)qJma0zu$Egxyw>#i#}LB8XsW< z0Du6Tv2Fqe8~V_%h=i$CHG|4@n}R$!qZ91(g*I6D_)@kdm#7g9YHCFd4-E2B?F3Nh zU^+isX5$G)Vxb^blnwE|Zm@}oO8^zwVbuafCs(K;UF1eM7+`E<1TtuUVRgEW5|598F_9?*XBMMBTd5@#-(bHjwc~StRJR{L z;2q!$un5Cwjue!ZmbM?rG!5(o1qF#9CMJjugOX5DF&XuQ7fWfN|oHA|fMGIIZt`@bnQazr=^~e^85`Coysf<0y9r z`>nQkxB&eIfiS(bw6x64X;U?;AY`MMgRh+w!^TjpY)AyXAJ#kkH@bpTpitV@TeTGd zq4!Pk$cNhzBFy2^Lsva5`}=y0%%yJy$U6gS*|vTHF6Jv5Akp;zV}jjXT|ZZAoFV^x zu-3dMr}<>}=;$b*wUxlDjZP?HW(`2NBUYAq0?5W<3nY-~yiQUoT>SjR76Cgc9F`D6 z!wxDLMO4~Ybfc|5l~aOh$oGHdhZ4&MLC%k+tThmlHAZcl7I~9CN zN=ntoHto|;(vnvbm9#2S-rlY38KiNO9fj5YQ_`bJIj(6=qO1PVrI5clM-4?tuzNJ5r^mE@_JxvWAS$e#`?pc`*1A-nN1-Cqp zN@$vKk-OEZYCX@_7~t%gpEX6!iRthJz#Ct4bLC1a!9+zvrVrp|RCu zk0pB1N|RE*^X~Z>>gMLAF&-2cSYhjk2wTbBeyB`1pC(Amj4N+KAx4hrGI{jLpA+Zmb9&dl2AFnjI zy%s8f2VwAgNnlm0QwgElqAF1d^<(`19FF1}0IZFtS1;A7u>i~kfYxEKx*lM<{r&v9 z75xe}0eu1}F$#*D4u6C?>!n&i^#L#ki{KJ5GBVQ9A@boi=|=}TBE%y!jZl;~%-nk8 zcT3`ZlT}mW)bod{=i5uTe7Q8b@0g;G*^oFMKtI93!Epoj3lKSg+?<-383E3QhedNK z`$8}%07UBjgP~Jt5(?lf3;?0N&ZM5He~g#~|BLT{4MTly?G2!=Yzk-KRF(+B1vI{~ zv9YM|cz4$n3=Sl9PfAGW^?Oa`K&QTQ9Cm7_2Y3q6BPm=YY>>B}Kt%EL^8;EfBqRi| z5P)u8@6Uwu+oGLYWC(a^=;qegtPm8B18zzb0Y?!K%-1Jt5=58;{O;@@k9Kx~@<18G zb)n?dJl+qkAuPiI?c{O%X+Qrh(#U_=Bl^cvy3#$p{PjOM2d;^f>M z7bRsN8nP+NFKRNJR(4uiq~O2qM&8R`<`wneTL=V#yPe8yC!G9C3R+Yo5}PCqDDH>b z-Ha;p1X2?}Iy)RSW$1%ItVBWf>FHO=p1!_d;t!u((StSa!X|-S1%0i;SOPF{h?tp~ zad#&afSa(LhJK?w10cQ!{fipn#tMF@6S zUstr~lpDOff?Bag$kK+*4+2_02ZC$(ahZx9*&|PO=>}` z3ZwJP8GH@cV3NjBt!x||U@R(W!0pioj5@74o5;e54D|}O!=*ar+K{8gnl4QBy-7f@ zR|7uWn>TM(S68!@@@Arc6&G8Yna#KPJTKMRo*$u$mgGq31kNbt@0dU!M()_+NvSMR zl+@JHJ|BUMxo*;D^|RRU0E{NM+8s5RMHt=wb7Vb`t>=a03;DTnDN>X!D(>vh6yLVJ zCJk}H<$x6tgE3z#7O3gu%J>yXq?N@+D5uye@n=*w|)I7=_|G9Az>-K0eK@?w3U}@PGlATOJHL{g*NOosR!S zHZI8&Ix%rtM#l5uLe=j7eeQrS;Wd!4)W;-g0dkFuY3H-Mb44IVHwGMX$@{;9Z4#QpViD%t0YkAX!>c?h4){v-uiTuI<4 z#L;QKK|nZJsypGKmdg#bwEv~w<_-9T8aE{x6-FDKfl^baObBn@gyn!T@9JVN7-zRi zrU`E8&bJ0)lXay2Ua_tumm#1_q$dq8{#Cf=C%}yWIQ}P@bD6E&vyym zzfVd@L3sU|^k&6n?Mp^(yP&Dze7Rwj>DZ2T60319n&3k_2`Ipp@c9KIhrH)H$yBDH zj|Fnxpy$PJ3^j1u!=E95ggDgm>+0&7nmowrvb#R+ZEx3@48#D$g^1@m+{f_OQg%9+ z-9Xl9cEzw1MngmM?uZD8B;1K`hm~=;`iRv&s&j^!l$E;Ug7j! z^fTS@0$G4lZ@k{_i%397xOrSsH+VQ#wnp_Gcx+WB-~tq@l~Bp2M`*vE>*?*y|8Y;r zv=@tgv&&%cc(v+rQo+rsJ}zTsRqo1SP_^EnfBbjZ8c%ght9kYp@dFIF42UZ`i??lLR`V&vqtz}&{Bb4TBYj9z1Mw-*6- z)B=cWa(eGiY18|%sjK*Es}=bBZdPUW2Rn_BJNdkl|y6qW9egXpxek49!> z*C>mCMGS7UeUF1v<9cS)iVR1%0{D<@`tyG)7^k#f_a^g%ZTtc|Z|PLCf#91o^;Ef2 zql={X5|$7ae&siRRJG+|$wA*7S5Ki`XEWki2nrM&K!`WG@;~oDATdzw?Q@g)i1uy# zG!%{C>Sz9Xd}s~1Nzl^cc$SEUxUew+9hRSrj7&iKZKgt4wn$b~xIY#v$u(t}OezYT zejk}iez|Nx+)Pgzqi(sG5%e?hUQi+M3 zvWOyG)B^BM8(RgQWVA8=qP-FrC8rNBB3+uVjEs{f%2(tF=Y?jl$j%?Y_Kh2WO)&vDC&??sPrq<(1ZHBBM4gCZ=C_ zbIKA_IzDvdef|jG-5ZumsXRN!wDu%7#{(MyGRA#nApkjHbjz&o@6#!RVNXEqtG&lP z?-j6JYQ{Pj-XcBsThtYx%))aBNWEbGI|X}D&Oq)`G5SgQh6tjpVQ|EGzaot@oWH4ijEWt5Q-M}i*MeH2xzr+^l}U@11y&)?JR z)u?UQ8FE$IR514oPTYUTxe~hK(71~@_IxVV(t1&87rBGxA$LCmG5=NXj&n4%66RYz zTBQy&S!)FG-8-DM34&8VF#%;sMxFZcj*gC*nVF%X10WrRnX^qwvs#t+B0i`c<4wH<`VwV+Cy(r548EJ4Q#mr3iT8ZkbsCDl1i^YAN3Zw7;* zccOgi8XHUH(!=LP$(h4Bf%5GSyNNv>)X-nc0OCG%V#;u z0OU7-C19sFl9dKx{rBYJN{1cQCVuVZ8!k(zsdF}4tSlL6^mOJno5EVDrMjc?pC^l3 zSnx(lJ+4B1RzFX8Ow5zkE@(vJEBnfjT9e9Fqp$-gkfj<+my=a~L-eYG({czI7`ZTb zkX={hVFDLI$pL;;+vPHwt}nTCG%Vj#FeN4?rvLfzrtxT)7ggJ+hWku^c(0%I{SaO<1GqG*EkF)zrz#Ff9>tem1(4bzY zbbP$Mha+vJoeJYVmQ}!3v=b7WEz^&}VLs0)#-I>q@d03bKC^RRa8Q^J@DSIFPlZTG zGPbt13JMCuBMG**w<~ZZp`U;SO}ra-aZ0mS(WqkhArE=Y|Gd~xcb9q{Vj&1KH5|X_ zvwF=Zdr$0LRl5`9uk#jx(R?}=dX|c4jL~N{lw1?1yv}C@l8xjcmAbQ*QfF8)K~f#j@6HD_Tmh?W z+vVwUk3KQ^yhxRq`lq(5ze}1!1O@EJs9kHYW3^blhd|=_B5z@S{jaLca&JMyy)-E82j3+nohw>Bs|8WosB>ZL@=SFZ@fEa=IzlFZ<*X@ zpEPyT-xqFnDYxJ^-@(?n%_e2Tg$}d5XHL%xhJP(8@6v630)rHn=O?c-+5Z9fv9khG z_YZkb*I>Z6N*ON`>1}*`w4Azcwt_91{tZ_P3%YyM{B&O-Lm+x*QTDSyfKdg4KI*t= zL03}&6KlV6WY;R)h_rEP=pPEw8tESz>MCMpV34_RDR;vAhs=I+z1znO7D16{J@dd@|8E^*|S7gx9(DV-sgocEiUSD4WbXvM;fcOv3PMo}$VLc66Y4PAH z)BEN--Tx>tmy4=s3+NUng8zro)9$a&dsu-N5O9Du4|q64h^P>=)qLrkXIxXwmj(r-C?KFT>1b%uUYe932q+!t(yLVIodD81iiRd7fQBA=Z%PMWq<07) zoj^h$5Nc$jyYKFQzwG|@+kTk)yEA8I&U2sV%$a-V#_MQ3zeCPMPC!6#NA-o0E&;)f zJNWxx(i`||KpwXQ0Re-$s*-|!fCVy_Ovk_|uYb2pU(;Xn;dCjgY_|+GWLNZhqSUUa z%;5vduC<)M6rtrC6r_@DO7pp-`SY5fw#40eeCHqtsB|imfu=3sa%4RyBJuL|{ ztdz12JkeWTsF2wVqrt+Js?Nd@+=};z-1hS2uazh4HnZdK@)^M75>G;5Nye)WLUX)O z?QN12Z}>+&|HML`grF>9p|@Ov!0`7{9W6T%U&fNsHx+o@JDnuma^MhP_CwCExSqCk zKxYw5<0YMPvhjIQ?y;I%9e2*XX;EjlrwIm`A&QwwK3#$4IE3Z$`LSNxIR+VeW!pA{ z#a!>5hJ{|A9%O3x2{KdEr}5%Jr1BnsY5%rO;rwYzGg6qM%QnJM(Y;T*wy60s&{ExG z4RZDCm<>0%SS3&q=)eELXe;+}6<1Rg6ts|xTT8PHJ#OU{wOowCLuU$)AQXV>#$Pv{6zcg_O<-kI-bzk@Emx)>dQ3@kGp$x5;DdBJN{Ts2InhE6rYadg!au@JaYP z>w7$zM=NJd*JnD5QMwzDP@7@I#;8WALKeVtXVp?{1Y8J{_;BxisEyWGr>a{P1g4t3 zmAeO-X#|!sel%%lP%%AkANHW3Q6zj_#uMze&ND!!O z)}me6hG0j@xo{EY=Al#1T}Bhx)s7Bw8Kq1Vezo*KZ`c~itM>Tx?DgDR_l2RkiNt^i zTC<6E8fKk-BXGv^bg&qlP9@@#8vm^M4|H58gmm-?zmq`#$~|Y<_-bcV58K&*bMUja zwq93X?%~)NJOB9{CU41zEo;2@a3f=Is3MDZ8S zD^gTjt}ac2Atx}X$Q>2!l1ue>me+^(Zk0+Em+brOR#=A8Icr4`mJYL+WFW_vbHyEav?;XMOZ?9t7*e%^2mqQs<;v<^PT}LUr-2a+XAX zQY$9}-fi7Z8cRTTTwffpJ(WMdoDDr6-OFb>9nzf-4ni=`>DKpULJmZ z>3lx-K7{o1*4lgsCYgz;yFred)D8kP72XK?ChDw(22S0T8$RaG+0PRn7Y~`9F(GQ8 zSM=EJ|2~AuBDD$2UuV!|Rjta+WxkV8c;! z#t%AH{iXND(@-Mz>XP8rUY6-)&W3aqHVrd`i!}S!QBNx(R$h?*Lj~?^qZyrJ;JnQQo0Dzj7i0 z?n^E5LtJ`+4m_}#hYjSA%#BZ!wo+j@!p;%QsKNI*3dmDU=rjT3+f8bdYT#j*e>-vT zTOFNt!q_wEgQZ&^BP<}ECpdZ5b6za18o%1a1sv85=xmvppTq<-T2`*nQbbZzEw{#s z8pesk=!=67?hVnG_wD(kEL+F#z4zD|hAv7a5_N#|rUkA!?P9ZYsovL?n+i&wZ3$BH zcQZ{cJv;S(k#F3Q!0JI}haCxqGfz0vD;vI`$J@HT@^n^{87ZL8T9_x>y`Uow=iB&H z{q4-C?*S#;JQ?^htSBtp)JzWejlXFsj>14JZ$Rn*7{E~5wh-v@ScCMHhO100YD<&sDWCAK8J09qZkz}w|(3AmQGpJgTm`SjxuO}TfMq6)AG(3pJ zOnV=&>1x0N$XO2u=xisK3!&o%=#jTcdOA8qEx#(h*@(Ds`|G*FYj?_E!6|FhS~tDl zTwXjfym+D859@_CbiF;+(@ISXAiP?q;$+RyZ;;-qo=BVQSCb-IQ}0Rauh0rS+88Qz zcMEB7t8!5M*o^sGl5Sm~-9f=PD~O;Kjvz_PpoM+OcK;eW+GR`car&sOc-?Ki!RbkG zNQ6u4g`p7X_eg_NAaT6KsRGYCDu357_!C)FjGobmMXUEVs_DgE`m&@5pE}iSv-T{@ ziHE1YX)n8*HAFA#4Xg)t;iffB9J?UshIpFcP0$T(b;rhS!MR8@ z$v*ei@>#%0ygcs0{h9})2pS**{$#jj0x3Evs~){@qydJXvI_YOrPd{AXWEp*8`DEt zBzl6MKjiD(lt`d@wl}|*S92>*c30VCAmM0#Q)W=j*f{zanys1T>wR^~scUg9PD6e~ z3S_RsVJqPlHFoO?<2^suGl~LUPd8fh7P@~j!j{1dCZgX9>C6SAxq%o3RdLKS^@dzq zWXz$A3K(!-{1gjqNi%in`(n0+=!@1eZ?<31_xim4t8dSI@R9Y9ct^lNKgEDT~oLjtgcr5ezlMYsiG zp@jTE4mjrkx^~EIcdS-37Nn~!uwn+|_8(?qd{wb#q=M{0H2m7Q2bTW}DzM=3EkCWf zUSg-Qju4|5x{oxK8@@B#Gj(4cN&dH;NJHF|$^K29r?q(-dA!R|UY8$&zNf!>TEbfp zh751_C|gY5McFR61RldR>|GbK4_fWzIe#6-YGe;De#-CVL&EZYcHFuv^<4w<0Qu@< z-L$cQj<(C%#%yT(4C&i(Sxgz(%!3%McbH1p;rFP0|GQDu z5b8E^P_%Z5=}YGpq;%0)??rRMz&nT)Ati*tMa_cd?&d4Gq=-DYh!FEsA!8%m)tjKcnE{2XCP24_DU))oLK< zI9|w3dU$>G6iKn9+e1Ov9UI}n1BRBtn6%_=dCP1V3V~^OpzE(swP~+b{b5VM4S$!avbJM&5%0EB%#g4AB zYI&$mE;|Qsb3%Q$AGJ9+jh3;oJ&>zw*VO+8>-juzc39?EB{RgOp5*NIqV!G(el@RW zzdku9!men&Ok1Ghdbj~`!xGqC+Gm&foYLYmy>OWKr4xRS|Ct6dOZ^=7`dha9LEbfX z#BvU|MeipZ-}llj?)vn4jw1GqXZPR{aR+ev+`yM#?eT1Ga)LJduB}L1?K~hyueYs} zv({K(>8R`?LSx*Fk)=Nwaec0&aXkun?_uOxChWM`T282KNiMjei_F%KoxbRPAAzRB&{g;4pp4KV zM&tMJa4V7oy4rOJdwP0I=nO;_g{XF!CkJ{p#~+qUq{C94RMeZ$yh5>r86*5YX?J2x z{<=Z#KukAPZ?V)`+{KY^e7VGOBQZ54IB0kUIxIUTVQ^r`4;1NhslrxV9CiWwpfy;_ zI;XGokh5O}2PHYEkNhg)lh>C&3QzEgSDVwykB1*trN|ZHgmo3evx+OO&WW7)U?gWz z4!Y%qKRg+unRBUz>o1chnT2CsSzt*86MU3kUD+u%_a!mGLE`DM>!0_RoXJbm+A`9}RoRxpvCe*Q3?y!% zWClmyy>)}OTyUkG;;ZbGk9F&)MblZ4L*oRAwXbluOVj1SQv-}--Ie#a*)F-zuzr;s z12gL#gl(|cWR*u>y2;tc396@R4W}bUCXeHRUyz29alZg<(9f~mpZsoJ+aSFmY<^aV zR*eV1zzG>4VSi1tNNf!sFuaCQmQ=R0As(jJ;eEI!w-Y+$f%raaB!ix@rp@oD4AO5r z*Rz+p08 z<-qfFCb0EQo~mU-$#FUFc6I5i&j%}B`=*TE48#L*H>DCc&-D*v>54A1MnAQwIc71} zvhmXV0JPXk$FLdK);LF)_A@wOlf7fZaHN((f@Q!U` znBe_P7hC>x_sZ0u8MX<%_`2po)Z-6PQhXFYXX4q@Yt|%RtPZ%frM#L~W9}UUwAv@g zSRL4ooaoA<4mF#p@k;Si-GG5Z^PQH@b@}0LzL7g@a>KWIBqXPnKtv)k4^lj}`pfwd zFPav(3W()~(fm_#{BoVp@##((Dx39Yn`a_s_x++%9jo}05wX~KW}C0TZNu%RuD0^r zLZ3WdD3927(ix6yySZN^K~MLew5#Crxq$4;zZe z)O*>xMjFPg3n23U1V}T=na1Sn`dH)Rn(rLPsB4@bD*2s*SqPg987c8uRB&l(>T3Vr{l&?*#NGcNXzZrV1Xx_sWU($&q zxVLM=#{eX>OQ@Wplvd0s{=7yd`hD#V?K5&WNmQ^9M^qBcpK3y-_T2ou>Rm-rMvgH+ z3=`g~osR;9!5Q!P{Wx)mO-TXXw+j8UZCbw&$4K3c=vX`oM)QCA2JG(akRomppXabX zL(qOV;w=H+`$Dd3W~#|jPdBUbrP)VKvXXhKe>#@tm`rg{cmfV*VPVOgxkXOJ1_Zk} zGB`tY=mm(O&H5|4-s<)*buwV36~HN&Z7HoUi}`O5Ki7sn0?5e7hK7dTT|Om@CH;Ov zA}R|k&}^eg=QEbB7sXExn-qVM>-ZaKOk#U`dv9-VULLDw+zm<$26JoX10xAUCj*+# z^oBU{St*Rh2%`HOT;w0-EaD6bMC-%+Ms=rfmzdgym~F*oXZ zl0Te?xB@viTU+LImsWM)N(p-;kJFSDm}h5R-kSC-t@y1Oqj?e?M2AvYDPA3Rn=)-{ zL0VVG!1JkDh#J^;eIZ|>5(xgS;~y@$ZmrAyYX5g?kK+qs{u`%0hoTp~XhjHnRFWWG zvE)kpsKK~spvV*v`oLC?PQ0x5>pQurRX;uaF`o2Liz_>xT2c;`F#st?6oUeO9JLKm zNCdTF+};0YhTgj0um;srQnin1@Q_J>9PaXX(Cy&=8+IG6CK>6b*`=(`%Z1E2exVp) z`e9PchvJ3l>G}Ej5|+U;G=(f_H5F& z`jRAapviW@L4K`_mMl$lQ-;+v7eqDq_^wH{J|u&aM-Eb-MMXjB+<7aR#VTD1LL!X+ z5K?^>b%72P76XoN`>%W^f=ah~KIAFry=4d@`Iq?--T8kJ0XcGO#dy^{Bdw}7n;-7b z_A=p%N?xq?v9oCI#h7j&HKPDzXF5qo@?i0#Ai12%cdsN;*Nn^r@95v1c^}0u7pv;1 zMRU4&Nb%e*)IMg?QX=CkuJ@g?hjvPoq^SGmk^R#dgNe7c^9Zrocm`pgc?w~dP=o{! z;#vE{T!D5w!GFBa&0D-RcbzkHyB-v_{7LLvFTThuSY Zo~&Xd+d5Z}_`eGTs>)hQm5Npo{{}1;P-g%D literal 0 HcmV?d00001 diff --git a/Ghidra/Features/Base/src/main/help/help/topics/LabelMgrPlugin/images/EditFieldNameDialog.png b/Ghidra/Features/Base/src/main/help/help/topics/LabelMgrPlugin/images/EditFieldNameDialog.png index 8e51de9e6a4578862bddd756c2b414153d42af99..7723b0d3ca03f60b11fde9fcbf6919f54bda1f36 100644 GIT binary patch literal 5750 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 vbrlZ%Ogv8a-rn97J1pi;S_b?AQq1Q#O? literal 6566 zcmcIpWmFtZvnD`*B{)m4;2LCuyDjdpNFaC;T!I8$ELd<0?z#a2!6i6Bf_w0==;FS( zUh=-*Irp42OVT1zc!I&~f z`*Xc>LF7f|6I2E0p-uJ=Ek@4vhvjj{_V!COa9n#Di$-=Bc0_rITySvDrzgTKoe^Iq zyhn4y{cpF9yD;%-bi}3dH2q6Etjz?usPyr1`UsTgkvyZ&AZkMm1&juw!!q9UX<}m^AgVBJ^L#1v!-O=byf;Z# zhi8J`clx`SYeBVi+obzYYKb?Z3>`Mm-Iy|JYMsg{v~?R2Y+ofL{=2)|+~0{pG)FPf zrN7(S{cB+&AYWkkbqaT{NRwVyZrbELV#>zOMyczi4ocl$N@y>u&(U^} zY=%B(vYs6cpmhbKdIRJ4%5jF0v$H`!?5C(ta!@Ip0N|}a^mEqyvQ>Mo49KeWv$nb( zD!WJ@<*{W$8G(-&WlYL6l<2vrAMa{uQMY~BII>9wgG~z9xoJ;bpQAY`S1ZGgv+6@r+^ta z_7t!Ok!|L==uoSG2ec?XZ%oVuU;W3ulj<*=YeTp1kh8{#0|Uw=(MLgp&wqqYG_QN` zI^af+GGmd+TmmF1C=FO5Ey_yZEIe%c`^C&NPvtxvc?5U_1Zty6lYirD;BZZNu)Sor z8vP?+yTfOYE3bmFcxoby$Ut$=LWVf4T>>eCk$0UtusGNJPZ-CMI zQco;8n&Un4u)4@LXEhNl9<9{2%-*BT>b$I)&PpRq%2=sD*wfSVvx}t>^NSS(HK*x6 z59i>S0Q{WpfDK_sIUg+JxDINVPKnWuy$zIJBzBR6((`wqopm3-tJ8_tYKvLbg07;( zve1EO&e1#Pc_TDAQtP3iEG@4R7ahMp!ZPK$5yhzzBuS3W!r}N1jb+Pw2hrwb`w@$c zay-9S&zqv6Luls4Do;ODyZZgHk!e*c%z`3YaHs70>W=WDlC?`k^+$vehjL#RJp?$I zPtnufhEGELs@|bRA1H%XOxs=gWoRwzX}9NX*sFto4s{f({<2XtmkWJ84{~;YW64W# zPLM=pS0t(JMZ40LF%4a$b(pp75)&w@U`iTLF{4exl#MBkf<`aTCLKRJzH%~3ptLPg z<3So^uDWr6R0I09w~W4lRtPtl%yW0?JR+}u+^&LIMxPy<`zfiDon}W4S|!eX=y{ox zBJhm}=^QZ{uzr9Euc^@sOC>NDd`2`|5Z2k%6^;l4AX&Ev70qJld48Cq)1Z>X<~AnY zReuK#05d9QLL*J^j-++&?hXhi-ukCK!!5Uvp`+TZ}C#WTtUX$KThz zDVIK}e_8N+?^*m{grliA-p{Ne5Da!?UJF2ez;wbbd*_wkOjM#n&&if3T~SMGlmBGq z;WZxP?Un#0(a2($S~Pyfdo$~|o1pmq{$lgI+Hp5>@3w zJ8<7)E-lw@bWrWkX0vTm^hZzX=3V}>y5&HgJG8#FbyZQ5pw{egw5BP?`&P8A8H`9M{YzXoZ*Fq;kM1QKP>< za0OwY!&ZO4yf%6uqkb=KvPXVxZ*(_aezClx z5k;&BEI4Ih1~5jK59+U`Z)y=E4`EEzYj#CHZ&!rnJXUXUTm|AFOg&7rO7ZLJ=bZYd zp`Yb6_T&4MD03X-^)3B zVTF^Dd6Js=!8qT@jUN~?Ym3UT1`uYEIjNLrEnNT|G?UcO^c8>qhFG|cmX1*>4W_q~ zD9xylLs%R{?g~FZ;NvnCx0rc-kMp(=~YTzqHME{^r3K|hx9SlaK_T>Oq$ zaETmiAm)5#hSH4*lrTCtxQ0MjZjvZP(s_v`;Y8asU0*}_w(l7vOv}h%q7um|lUq$u zOy$%@_I$P<18ViPQn^j_{7+p|(8(m;Wzo|QIT?!tNl3m)EK{#ntE*9_u)PSkcF~J+ z3y*-wrL-7RPW+-dX$JXT@NE_8wC5jOdivej>z(^NC8^TTFEL|VxjWw5O3?NT5*e+n|5xr#|ogV#FUR)fEycP)kc}}!jS*%Z$7;$S!G0+pa##~z&;UU z0tWiCleJ&lJ68$_9_FEllgUXcQjelf)Eqww6eXy$)hWFFRW(73K%gRp{Ne_H!Z@X> zn2?ymRQJLOm*pAewsl!L*vgU7gG1Uc48oe% zfJGno5P|NZBQ5~O{W3$AQ+XfuFTn9wm8xVZR?wF=aR*yH@1QR`-pGPs3R}!Yyz{`} zL;N2-CZ$=C3^0iuzWnvX)sV>aYr?0G_3@)(kgPP}pWXl5dIKS-lFrb}y{~?u>|u5u+`2z z*gW)OmM@Q|^mTAre9@`vFL@+X2`U-nGG$TZ&8R1#ca}W(>;;l%I^iK&)bj;6>nGMX=_EeX z<08svEVdR;%MTbs4R)hW0bZLZybQ5jwQ%q_Y91{|2kv~{_P@wht!8-|Qf-NRiBBT- zTPd#2|83Vc26tIE5_lyzJ3}(x%fL%Vy>)<6x}>W3iZyXe5al>+0mOEZD|$;=EO<6g zNcLlrMJOf3duM}n6p-Nd&T2Kn~ScjSfkckB1IWiO0*sy1{XRlWBRw{DLw_D@z6<4i3! z7^$q&@w*EqCuDJxSB)Mdp3o!Q=vAAV7Wd*sn|~VUnj$xCZrO(up%`lBK17~H=&pnc zDcI#X_wjmgSp$rqIukYq6POBC5(Y$%3p&}%pf-Oe?dymNqgl3~XUWYpir*$-w9Kqum6A_@PaT9N z8<5NFYhIquoq=I7!E7UWGGPoLf_9DY@Cosoh)t2i)L68?bi7a1P8GF{mXn`TL_{R> zA1dq4Z0LM-yg+2^(D{`Tojl;*{eoX&@KF_?XLyfo+?F5Wq*maW0@%!?!P(6}aR098)4YPm`4dTP;kwME}KQ z+-K=L9ai{u? zqhaEnQ(ZI~fxO$z&49*sDy3_*5a~L7Gx|!RNn;=l7u_r=hNy93fo8D=P`_mSW+hY& zi`l*LWOAz00Ej*HE+D)^Imfn>ch1e>B|3z1EEp^QoxxIYD8oaq=*G(h0sAY9-AuNRoeV-(hf9_t{a1NG8ygn7Z){>%fyMXqpSn z?uK8Pcmn2NF8pDhh>tGc^3jwA)n3oC9w27UrRnB(B!!S{ zii31(Jn@+-%O3unqvtXonZ>X`-XJ-((4TF6)N}#}ufcGzS=1{kfuF<5Hk7d5^Ur<4 zFGkod%o-v?Kt&%#J+@cfY9g|iom+{BreFL}$C#i|2sgvHtZno}zO+CG|NdOhMJMJT z*!y`W9dDAC!R17$ki}k%0uzwEA}MIwxd@&x@x=r!y33P;iRpJ_4O5*)Eyz9h7Gwms zLHR5l(N)?->KXoubk0qHpJ~e-AtSxy?+Ilcte+8Q=d~5(I|yM&oPcjayGh#s?c78d z(aSOE=7&^B*9_C-4NY+vK<$@$kc!jG@v2!XYiZeGYX;&#|I^{J)pfFSSlgPSZ5 zF@`4+1n#?VVj>K@@vP=)8JkXOidJF1sNVT}03m+?zuG1Eiuv|{$TP znl$WRD=4g!0fgvRH&Vp(VG)mR|Gx__J85*VPDp348&+U35D$qFPOG>O$Sg}h67+u& z1+SS^L4Iwb8$B&G{_5wx{8yLkJu@*Jtmp#)`KfLK8IS)&baZw5&3OW(;$Y9E=rr+w zPhs4p`<2D9fCSiR3i`e9=3Z$CcuFOxG{xj=o4YJT)YQEZIu1)0-u#w=(H1nuMvrlf(1_1mX> zclkE6*9&6HU!OR>*`RD(Lz4sB4B3iu?7Z(JXE7ZSHQguE-}emAGK)sDaTS7yRxJ6L z4YwfqdDUg(TxjCAq^gT2rB&4Q>m-m`3m(Q|}>iHRWUYg;V>qEN#_0;WTyGg{L z#&n7T_4!o&-ne6N%)aH~Hi*LDx)sBjg@%=(wH1SMdw3Q+-^5#g@uJva4H+fg-`jtf z#U^F>fq%$0LqSW62swO1M=j}RZ(}3uwA^vFJL3(7mK)S58ybo-Gk;E-fz}QM{~aw} zc?!-MKZoSc;@3F~sGw)r55wnLB27mniyj&+zE#~#bTvVV|>wxV|IU)c0&E7aZhwg&>6z97LZEPCr#EmSE=lW5C;=vgKxH zbNjP5tI6l9MPn58ix16NT`T%OfKrC<W=4wFi&l+P327gf*UVE>G zB_rZ-u(!WIyq9})bVSB)t8)l%?Tw+zh>r&c)>w^xzMTGU$j{HO5c8rWs*B3){`LwD z17~ZzAT%K02_UecNImOYULLp4r4wS2SKwsQni^DQPm1Gn~& z<}GRuT90)*HlI<6`23PMKT7_VJpSqLQjU$~e+z|*B>vh&rcnWpR=6Z39}t5nHI~Ea z622mUz>w>+-3Fg4mv}|=N4ir*=ghUU{4=P+wEcc(sx&YV)ne@D&y^Wd|Fe^miK!{w zkx$Gz#I-Z+^+!GqE4nH-*Ci8gUZ6TEzu!cKj@^!_s28crSV6(fp~>;TxRB~u&0C=6 z5o)*=B!eZNUW9U?FE}qRPxG+V`y!R<(B<;zt*1GYLuFi67M0D-6W}JtOGsV~$2K;HZbx5hTx8}Y^+&u1 zOicWUi(a`AH#hf+mbHydJnf?N{r!D+@KG@UdE_aE(6<=-{rh*>lWKx=O7|?n)c6aoZ`j8Qw1Mq4z3rdrJFOp9(VMYk8SZz9M@3$x(Oy#ve-0I zD3et;MXO@PrXR(Rj*rLBLG<*DjBe+wa^&RYrEj{!i4O(yRGHD*f8y4>twkk@3Jc4{ z+#L(vF_#`j)IkppZ7(P-*VkY+9^a6pix|Ri+7y}OBG+wrQBKmcMs(uyjCE|>MdJ!6 z&SPcu{cP*#)t6l;2c66{_>QQ1465GV^vW3M?_kWH#b%FozdH($ot@nZxh`80GYd-) zKt)Amg?s`IH<6JES{JmHHXBOiJ}P;|!h$)^m3b=!pO_$8MIaDke#fglj_r59QuD5I z0SgRh&u3zse0e+T?n~=e*&Aacg{2EpYZ9-^ z3&rgRk>z)%O*ZLxOV@#qfgdsN?@Out{xNYHm`Qic%#a?0E;hMQ3fPmS4$RL}7@<2; zQf8DJH=iFaJoJ<59F16zuJMHdHm6D>bP(K56RVF2or1~5!|Ma~%kB*JC z8XEH%3*L|S!>f}qg5x;TnHm}{*w(#XnldmJGheW?)Z2}GBQ4o0z)!aVZ}omxm3mCv z*&9of;648g8>&|z=5-Q$C+T#1e{+aWEoO!;`JC^qcj4%*pn)OW+E*i-uin)>Ub?L! zNZ_A*T)Q_jErNb&XSW|u$Zm^aUrf1WB-pWyd!n>eTU%EOha`^IzIro`+Cf|Uc#PHihdWc=a#=x}G>_94Doand zL;>ObZw<2aV|I_T914|PsK54%m9N4yhVm{+h&4xPQ2sv&sNmZ-Z0d!H$w~6|XY7|(XBo@{SZFVex%xas1p9Pa<@_z5uU}hQSjfrBqGMv3 z?kr0IG_exV*-D}ci>hI?RCxb`PmdHR#HMjSvTbZG zS_O`mZ$A^F+pu?h%B<|uwl)>K8<&LFcYbyCOdj~@`qdFEt^H_{p0xyijthVY`L^q;C}(rF{73M diff --git a/Ghidra/Features/Base/src/main/help/help/topics/LabelMgrPlugin/images/LabelHistoryInputDialog.png b/Ghidra/Features/Base/src/main/help/help/topics/LabelMgrPlugin/images/LabelHistoryInputDialog.png index 01f3248f2af39b8bc7b07ecf759ba129baad8595..c891ef782bce5aa1f8778bbd8b3600f584901219 100644 GIT binary patch literal 6329 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਼=Og}W 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 literal 6616 zcmaJ`by!s0w+2C^8<7S1OD> z=lj0j@7D9&d;Zwx?0ufI*4pc={l4!$CsIvSjsTY$7Yz-KKtWzc0}Tyb4Y*FhegL#V zQvzaWXjHihGLl-}GkZBWdYY4nAI$H38A^ro3WOVm>JWsmgwFh^Rag{0LMQR{$BBF$ zk}76Z3gWk{6pspDIKCy9DK3@7M<;uL)A@-#0z{c8=-pM|JtKAj3A(!U46(2!VNI=!NNAaT z0~7=~-W>k&h=_iU?SI^6y!{c+FxpHkvx@aHd`kaq!~Oy@b^#7rP3``Cpi4Mo1S?wi z(07TR-X<=R#glpU%}w{yFZsOWF4$mK0(MSL^5`A~1qD6>wQo$>0=8M|2~FGiX~=$_E`mBbjL$ui6=yg=lSU7BDcJU`XHV(> z^T#scW~C=O<8N!FW$k-?93`|X#qOe`*T$WBcWDyAf0ZgO<0p)z7U$zVOx_?T>$lH*r1k+GucKEC8~ZH)uvJEm;oHV#+Ipx=2&4^w0ZqSJ}lX zzED(Ap)g6M+y-q(Z!}{SQOv7ht22FmOwC;{Rpx3!T22t+Wn4N2w!1KbYBu(}B-b%6 zMDX^0(I`Fff6@JPkI|~8EM^k|f-d&Che{RYHp%l_mTBeN7wY`9DwC?W_R$y@2-PZ6 zTm1b_&19MQ*Lb3-n>Uo?g|TzEOKGm5{)QB!ht+)enRgFvy=23acC}iqG&mjsI6yyN ziPwPz+y_Z9XnFHg+l)kANpCV%jn_ZSnhja%9~@*W@b{dv($gadKyHr6S09^(zTl$w z&cuoDeIx*VISVQ<^Rf6VF-BEv_AaAEUcGFc5<;ps#OZ$jTu!|6McG<71Bat^o=&9Cd$BTzz_SPEiYZt6w z|M2~GFs@eQT1ebfh$P;hNc%>Rf6QVZzIz_1qhu~AdHu)oksn#VED1xXTkabx-Vb+) zDGmz-2^9}+wJQIt+m*2LZ)S_4BHpwJMQoPp^}M)|q976y#Up)Z!bvOe)8M3#4dH`7y41>} z7(WD--gKjf9Y$1hLFYuS$xAh#ajky{`MkCrBY#4hnE5Do^F$STyEw#wH#S|vZDjJ% zTG4Ls@|(FJ($*eMZm}+Na4eHsQur_mkIAO-(j`jjt5zA_C%IJDJ;A7SS0W!5xr;~+ zRax4$oRS`2x8Fp3&qp|{@Cvr(`1MLNG>3*^{Ef_re6r=?dXUf}N<^10sBuYT?%e~c zW)YOm0a-t}V!eUi$fLH<9xI#Ila=qj>5K4}pU#}B8^uUH&az;6D8u#MSU^ez)49U& zUrk^=)P>6{o*xX>P^AbA@GOo%Zm{*xeRq4MM&sgiK)b)od})Oa38$=S5-<6X
^ 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 labelNameChoices; @@ -337,55 +339,65 @@ public class AddEditDialog extends ReusableDialogComponentProvider { } } - // This method only gets the namespace associated with the current address - // and it's tree of namespaces. It does not walk the namespace tree of - // the symbol, which can be different than that of the address. private void initNamespaces() { namespaceChoices.removeAllItems(); + for (Namespace namespace : getSelectableNamespaces()) { + namespaceChoices.addItem(new NamespaceWrapper(namespace)); + } + } + + private Collection getSelectableNamespaces() { if (!namespaceChoices.isEnabled()) { - namespaceChoices.addItem(new NamespaceWrapper(symbol.getParentNamespace())); - selectNamespace(); + return List.of(symbol.getParentNamespace()); + } + + SequencedSet namespaces = new LinkedHashSet<>(); + addGlobalNamespace(namespaces); + addCurrentNamespace(namespaces); + addSuggestedNamespace(namespaces); + addRecentNamespaces(namespaces); + + return namespaces; + } + + private void addRecentNamespaces(SequencedSet namespaces) { + List recentNamespaces = NamespaceCache.get(program); + if (recentNamespaces == null) { return; } + for (Namespace namespace : recentNamespaces) { + if (!namespaces.contains(namespace)) { + namespaces.add(namespace); + } + } + } - Collection collection = new HashSet<>(); + private void addSuggestedNamespace(SequencedSet namespaces) { + Namespace namespace = program.getSymbolTable().getNamespace(addr); + if (namespace == null) { + return; + } + // Don't include the currently edited symbol as a possible choice + if (symbol != null && namespace.equals(symbol.getObject())) { + return; + } + if (!namespaces.contains(namespace)) { + namespaces.add(namespace); + } + } - // we always add the global namespace + private void addGlobalNamespace(SequencedSet namespaces) { Namespace globalNamespace = program.getGlobalNamespace(); - - NamespaceWrapper composite = new NamespaceWrapper(globalNamespace); - namespaceChoices.addItem(composite); - collection.add(composite); - - Namespace currentNamespace = program.getSymbolTable().getNamespace(addr); - - // no symbol or not editing a function symbol - if ((symbol == null) || (symbol != null && symbol.getSymbolType() != SymbolType.FUNCTION)) { - // walk the tree of namespaces and collect all of the items - for (; (currentNamespace != globalNamespace); currentNamespace = - currentNamespace.getParentNamespace()) { - composite = new NamespaceWrapper(currentNamespace); - - if (!collection.contains(composite)) { - collection.add(composite); - namespaceChoices.addItem(composite); - } - } + if (!namespaces.contains(globalNamespace)) { + namespaces.add(globalNamespace); } + } + private void addCurrentNamespace(SequencedSet namespaces) { if (symbol != null) { - // we are adding the current namespace of the symbol if it is not in - // the namespace tree that belongs to the address - Namespace symbolNamespace = symbol.getParentNamespace(); - composite = new NamespaceWrapper(symbolNamespace); - if (!collection.contains(composite)) { - collection.add(composite); - namespaceChoices.insertItemAt(composite, 1); - } + namespaces.add(symbol.getParentNamespace()); } - - selectNamespace(); } /** @@ -478,6 +490,7 @@ public class AddEditDialog extends ReusableDialogComponentProvider { namespaceChoices.setEnabled(true); initNamespaces(); + selectNamespace(); clearStatusText(); } @@ -538,6 +551,7 @@ public class AddEditDialog extends ReusableDialogComponentProvider { namespaceChoices.setEnabled(true); } initNamespaces(); + selectNamespace(); clearStatusText(); } @@ -550,12 +564,11 @@ public class AddEditDialog extends ReusableDialogComponentProvider { @Override public Dimension getPreferredSize() { Dimension size = super.getPreferredSize(); - // change the preferred size to use the width determined by the # of columns in - // combo box editor instead of the largest item in the combo box data model to - // prevent the dialog from growing huge when a large label gets added to its recent - // items - Dimension editorSize = getEditor().getEditorComponent().getPreferredSize(); - size.width = editorSize.width; + // Change the preferred size to use a standard starting width. Previously, it + // was sized on the first label edited, but then it just remembered that size. + // A width of 500 is a good starting width that will fit most reasonable + // namespace names. + size.width = 500; return size; } }; @@ -598,7 +611,8 @@ public class AddEditDialog extends ReusableDialogComponentProvider { mainPanel.add(bottomPanel); topPanel.add(labelNameChoices, BorderLayout.NORTH); - midPanel.add(namespaceChoices, BorderLayout.NORTH); + midPanel.add(namespaceChoices, BorderLayout.CENTER); + midPanel.add(buildBrowsePanel(), BorderLayout.EAST); bottomPanel.add(entryPointCheckBox); bottomPanel.add(primaryCheckBox); bottomPanel.add(pinnedCheckBox); @@ -610,6 +624,26 @@ public class AddEditDialog extends ReusableDialogComponentProvider { return mainPanel; } + private Component buildBrowsePanel() { + JPanel panel = new JPanel(new BorderLayout()); + JButton browseButton = new BrowseButton(); + browseButton.setToolTipText("Choose Namespace"); + browseButton.addActionListener(e -> showNamespaceChooser()); + panel.add(browseButton, BorderLayout.CENTER); + panel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); + return panel; + } + + private void showNamespaceChooser() { + NamespaceChooserDialog dialog = new NamespaceChooserDialog(); + Namespace namespace = dialog.getNameSpace(program); + if (namespace != null) { + NamespaceCache.add(program, namespace); + initNamespaces(); + namespaceChoices.setSelectedItem(new NamespaceWrapper(namespace)); + } + } + private void addListeners() { labelNameChoices.addActionListener(e -> { if (program != null) { @@ -636,6 +670,11 @@ public class AddEditDialog extends ReusableDialogComponentProvider { return text; } + // for testing + public JComboBox getNamespaceComboBox() { + return namespaceChoices; + } + public class NamespaceWrapper { private Namespace namespace; @@ -672,4 +711,5 @@ public class AddEditDialog extends ReusableDialogComponentProvider { return namespace.hashCode(); } } + } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/NamespaceCache.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/NamespaceCache.java new file mode 100644 index 0000000000..3fc485eb75 --- /dev/null +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/NamespaceCache.java @@ -0,0 +1,59 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.util; + +import java.util.*; + +import ghidra.program.model.listing.Program; +import ghidra.program.model.symbol.Namespace; +import ghidra.util.datastruct.LRUSet; + +/** + * Static class for remember the last few namespaces used for a program. + */ +public class NamespaceCache { + public static final int MAX_RECENTS = 10; + private static Map> recentNamespaces = new HashMap<>(); + + /** + * Returns the list of recently used namespaces for the given program. + * @param program the program to get namespaces for + * @return the list of recently used namespaces for the given program + */ + public static List get(Program program) { + LRUSet recents = recentNamespaces.get(program); + return recents != null ? recents.toList() : Collections.emptyList(); + } + + /** + * Adds a recently used namespace for a program. + * @param program the program to add a recently namespace + * @param namespace the recently used namespace to remember + */ + public static void add(Program program, Namespace namespace) { + // no need to cache global namespace, it is always available + if (namespace.isGlobal()) { + return; + } + LRUSet recents = recentNamespaces.get(program); + if (recents == null) { + recents = new LRUSet(MAX_RECENTS); + recentNamespaces.put(program, recents); + program.addCloseListener(p -> recentNamespaces.remove(p)); + } + recents.add(namespace); + } +} diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/NamespaceChooserDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/NamespaceChooserDialog.java new file mode 100644 index 0000000000..43ddafac52 --- /dev/null +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/NamespaceChooserDialog.java @@ -0,0 +1,123 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.util; + +import java.util.ArrayList; +import java.util.List; + +import javax.swing.*; + +import docking.DialogComponentProvider; +import docking.DockingWindowManager; +import docking.widgets.DropDownSelectionTextField; +import ghidra.program.model.listing.Function; +import ghidra.program.model.listing.Program; +import ghidra.program.model.symbol.Namespace; +import ghidra.program.model.symbol.Symbol; +import ghidra.util.exception.CancelledException; +import ghidra.util.layout.PairLayout; +import ghidra.util.task.*; + +/** + * Class for choosing a namespace + */ +public class NamespaceChooserDialog extends DialogComponentProvider { + + private DropDownSelectionTextField dropDownField; + private NamespaceDropDownModel namespaceModel; + private Namespace chosenNamespace; + + public NamespaceChooserDialog() { + super("Namespace Chooser"); + namespaceModel = new NamespaceDropDownModel(); + addWorkPanel(buildWorkPanel()); + addOKButton(); + addCancelButton(); + } + + public Namespace getNameSpace(Program program) { + List namespaces = gatherNamespaces(program); + if (namespaces == null) { + // user cancelled while gathering namespaces + return null; + } + namespaceModel.setNamespaces(namespaces); + DockingWindowManager.showDialog(this); + return chosenNamespace; + } + + @Override + protected void okCallback() { + chosenNamespace = dropDownField.getSelectedValue(); + close(); + } + + @Override + protected void cancelCallback() { + chosenNamespace = null; + close(); + } + + private List gatherNamespaces(Program program) { + GatherNamespacesTask task = new GatherNamespacesTask(program); + TaskLauncher.launch(task); + return task.getNamespaces(); + } + + private JComponent buildWorkPanel() { + JPanel panel = new JPanel(new PairLayout()); + panel.add(new JLabel("Namespace: ")); + + dropDownField = new DropDownSelectionTextField<>(namespaceModel); + panel.add(dropDownField); + panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + return panel; + } + + private static class GatherNamespacesTask extends Task { + private List namespaces; + private Program program; + + GatherNamespacesTask(Program program) { + super("Gather Namespaces"); + this.program = program; + } + + @Override + public void run(TaskMonitor monitor) throws CancelledException { + List list = new ArrayList<>(); + list.add(program.getGlobalNamespace()); + for (Symbol symbol : program.getSymbolTable().getDefinedSymbols()) { + monitor.checkCancelled(); + if (!symbol.getSymbolType().isNamespace()) { + continue; + } + Object object = symbol.getObject(); + if (object instanceof Function f && f.isThunk()) { + continue; + } + list.add((Namespace) object); + } + namespaces = list; + } + + List getNamespaces() { + return namespaces; + } + + } + +} diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/NamespaceDropDownModel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/NamespaceDropDownModel.java new file mode 100644 index 0000000000..46ac5f93b7 --- /dev/null +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/NamespaceDropDownModel.java @@ -0,0 +1,193 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.util; + +import java.util.*; +import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.help.UnsupportedOperationException; +import javax.swing.ListCellRenderer; + +import org.apache.commons.lang3.StringUtils; + +import docking.widgets.DropDownTextFieldDataModel; +import docking.widgets.list.GListCellRenderer; +import ghidra.program.model.symbol.Namespace; +import ghidra.util.datastruct.CaseInsensitiveDuplicateStringComparator; + +/** + * This is the drop down text field model for namespaces. + */ +public class NamespaceDropDownModel implements DropDownTextFieldDataModel { + private static final char END_CHAR = '\uffff'; + private List namespaces; + private ListCellRenderer renderer; + private Comparator comparator = + (n1, n2) -> n1.getName().compareToIgnoreCase(n2.getName()); + private Comparator stringComparator = new CaseInsensitiveDuplicateStringComparator(); + + NamespaceDropDownModel() { + renderer = GListCellRenderer.createDefaultTextRenderer(this::getListDisplay); + setNamespaces(Collections.emptyList()); + } + + @Override + public List getMatchingData(String searchText) { + throw new UnsupportedOperationException( + "Method no longer supported. Instead, call getMatchingData(String, SearchMode)"); + } + + public void setNamespaces(List namespaces) { + this.namespaces = namespaces; + Collections.sort(namespaces, comparator); + } + + private String getListDisplay(Namespace namespace) { + StringBuilder buf = new StringBuilder(namespace.getName()); + Namespace parentNamespace = namespace.getParentNamespace(); + if (parentNamespace != null) { + buf.append(" ("); + buf.append(parentNamespace.getName(true)); + buf.append(")"); + } + return buf.toString(); + } + + @Override + public List getMatchingData(String searchText, SearchMode searchMode) { + if (StringUtils.isBlank(searchText)) { + return new ArrayList<>(namespaces); + } + + if (!getSupportedSearchModes().contains(searchMode)) { + throw new IllegalArgumentException("Unsupported SearchMode: " + searchMode); + } + + if (searchMode == SearchMode.STARTS_WITH) { + return getMatchingDataStartsWith(searchText); + } + + Pattern p = searchMode.createPattern(searchText); + return getMatchingDataRegex(p); + } + + private List getMatchingDataRegex(Pattern p) { + List results = new ArrayList<>(); + for (Namespace namespace : namespaces) { + String namespacePath = namespace.getName(true); + Matcher m = p.matcher(namespacePath); + if (m.matches()) { + results.add(namespace); + } + } + return results; + } + + private List getMatchingDataStartsWith(String searchText) { + MappedList list = new MappedList<>(namespaces, n -> n.getName()); + + int startIndex = Collections.binarySearch(list, searchText, stringComparator); + int endIndex = Collections.binarySearch(list, searchText + END_CHAR, stringComparator); + + // the binary search returns a negative, incremented position if there is no match in the + // list for the given search + if (startIndex < 0) { + startIndex = -startIndex - 1; + } + + if (endIndex < 0) { + endIndex = -endIndex - 1; + } + + return namespaces.subList(startIndex, endIndex); + } + + @Override + public List getSupportedSearchModes() { + return List.of(SearchMode.STARTS_WITH, SearchMode.CONTAINS, SearchMode.WILDCARD); + } + + @Override + public int getIndexOfFirstMatchingEntry(List data, String text) { + // The data are sorted such that lower-case is before upper-case and smaller length + // matches come before longer matches. If we ever find a case-sensitive exact match, + // use that. Otherwise, keep looking for a case-insensitive exact match. The + // case-insensitive match is preferred over a non-matching item. Once we get to a + // non-matching item, we can quit. + int lastPreferredMatchIndex = -1; + for (int i = 0; i < data.size(); i++) { + Namespace namespace = data.get(i); + String name = namespace.getName(); + if (name.equals(text)) { + // an exact match is the best possible match! + return i; + } + + if (name.equalsIgnoreCase(text)) { + // keep going, but remember this location, in case we don't find any more matches + lastPreferredMatchIndex = i; + } + else { + // we've encountered a non-matching entry--nothing left to search + return lastPreferredMatchIndex; + } + } + + return -1; // we only get here when the list is empty + } + + @Override + public ListCellRenderer getListRenderer() { + return renderer; + } + + @Override + public String getDescription(Namespace value) { + return value.getName(true); + } + + @Override + public String getDisplayText(Namespace value) { + return value.getName(false); + } + + /** + * Provides an read-only mapped view List of type T from a List of type S. + * @param The type of elements in the source list + * @param The type of elements in the mapped list + */ + private static class MappedList extends AbstractList { + private final List sourceList; + private final Function transformer; + + public MappedList(List sourceList, Function transformer) { + this.sourceList = sourceList; + this.transformer = transformer; + } + + @Override + public T get(int index) { + return transformer.apply(sourceList.get(index)); + } + + @Override + public int size() { + return sourceList.size(); + } + } +} diff --git a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/label/AddEditDialogWithNamespaceChooserTest.java b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/label/AddEditDialogWithNamespaceChooserTest.java new file mode 100644 index 0000000000..229900e00c --- /dev/null +++ b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/label/AddEditDialogWithNamespaceChooserTest.java @@ -0,0 +1,192 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.plugin.core.label; + +import static org.junit.Assert.*; + +import java.awt.event.KeyEvent; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.*; + +import org.junit.*; + +import ghidra.app.cmd.function.CreateFunctionCmd; +import ghidra.app.plugin.core.codebrowser.CodeBrowserPlugin; +import ghidra.app.plugin.core.navigation.GoToAddressLabelPlugin; +import ghidra.app.util.AddEditDialog; +import ghidra.app.util.NamespaceChooserDialog; +import ghidra.app.util.viewer.field.MnemonicFieldFactory; +import ghidra.framework.plugintool.PluginTool; +import ghidra.program.model.address.Address; +import ghidra.program.model.address.AddressSet; +import ghidra.program.model.listing.Function; +import ghidra.program.model.listing.Program; +import ghidra.program.model.symbol.*; +import ghidra.test.*; + +public class AddEditDialogWithNamespaceChooserTest extends AbstractGhidraHeadedIntegrationTest { + private TestEnv env; + private Program program; + private AddEditDialog dialog; + private PluginTool tool; + private LabelMgrPlugin plugin; + private JComboBox namespacesComboBox; + private Symbol symbol1; + private Symbol symbol2; + + @Before + public void setUp() throws Exception { + env = new TestEnv(); + + ClassicSampleX86ProgramBuilder builder = new ClassicSampleX86ProgramBuilder(); + builder.createNamespace("Foo"); + builder.createNamespace("Bar"); + program = builder.getProgram(); + + tool = env.showTool(program); + tool.addPlugin(CodeBrowserPlugin.class.getName()); + tool.addPlugin(LabelMgrPlugin.class.getName()); + tool.addPlugin(GoToAddressLabelPlugin.class.getName()); + + plugin = getPlugin(tool, LabelMgrPlugin.class); + + symbol1 = builder.createLabel("0x10065a6", "symbol1"); + symbol2 = builder.createLabel("0x10065a9", "symbol2"); + createEntryFunction(); + builder.dispose(); + + dialog = getAddEditDialog(); + + namespacesComboBox = dialog.getNamespaceComboBox(); + + } + + private AddEditDialog getAddEditDialog() { + return runSwing(() -> plugin.getAddEditDialog()); + } + + @After + public void tearDown() throws Exception { + close(dialog); + env.dispose(); + } + + @Test + public void testUsingNamespaceChooser() throws Exception { + + editLabel(symbol1); + assertNamespaces("Global", "entry"); + assertSelected("Global"); + chooseNamespaceFromChooser("Foo"); + assertSelected("Foo"); + pressOk(); + + editLabel(symbol2); + assertNamespaces("Global", "entry", "Foo"); + assertSelected("Global"); + chooseNamespaceFromChooser("Bar"); + assertSelected("Bar"); + pressOk(); + + editLabel(symbol1); + assertNamespaces("Global", "Foo", "entry", "Bar"); + assertSelected("Foo"); + pressOk(); + } + + private void assertSelected(String name) { + assertEquals(name, getSelectedNamespace().getName()); + } + + private void assertNamespaces(String... names) { + List comboNamespaces = getComboNamespaces(); + assertEquals(names.length, comboNamespaces.size()); + for (int i = 0; i < names.length; i++) { + assertEquals(names[i], comboNamespaces.get(i).getName()); + } + } + + private void chooseNamespaceFromChooser(String text) { + AbstractButton button = findButtonByName(dialog.getComponent(), "BrowseButton"); + pressButton(button, false); + NamespaceChooserDialog nd = waitForDialogComponent(NamespaceChooserDialog.class); + JTextField field = findComponent(nd.getComponent(), JTextField.class); + typeText(field, text, true); + enter(field); + pressButtonByText(nd.getComponent(), "OK"); + } + + protected void enter(JTextField field) { + triggerActionKey(field, 0, KeyEvent.VK_ENTER); + waitForSwing(); + } + + protected void typeText(JTextField textField, String text, boolean expectWindow) { + waitForSwing(); + triggerText(textField, text); + } + +//================================================================================================== +// Private Methods +//================================================================================================== + + private void pressOk() { + pressButtonByText(dialog, "OK"); + } + + private Namespace getSelectedNamespace() { + return runSwing(() -> { + Object selectedItem = namespacesComboBox.getSelectedItem(); + return ((AddEditDialog.NamespaceWrapper) selectedItem).getNamespace(); + }); + } + + private List getComboNamespaces() { + return runSwing(() -> { + List namespaces = new ArrayList<>(); + int count = namespacesComboBox.getItemCount(); + for (int i = 0; i < count; i++) { + Object itemAt = namespacesComboBox.getItemAt(i); + namespaces.add(((AddEditDialog.NamespaceWrapper) itemAt).getNamespace()); + } + return namespaces; + }); + } + + private void editLabel(final Symbol symbol) { + // this makes debugging easier + CodeBrowserPlugin cb = getPlugin(tool, CodeBrowserPlugin.class); + cb.goToField(symbol.getAddress(), MnemonicFieldFactory.FIELD_NAME, 0, 0); + + runSwing(() -> dialog.editLabel(symbol, program), false); + waitForSwing(); + } + + private void createEntryFunction() throws Exception { + Symbol s = getUniqueSymbol(program, "entry", null); + Function f = program.getListing().getFunctionAt(s.getAddress()); + if (f == null) { + Address addr = s.getAddress(); + AddressSet body = new AddressSet(addr, addr.getNewAddress(0x010065cc)); + body.addRange(addr.getNewAddress(0x10065a4), addr.getNewAddress(0x010065cc)); + CreateFunctionCmd cmd = + new CreateFunctionCmd(null, addr, body, SourceType.USER_DEFINED); + assertTrue(tool.execute(cmd, program)); + } + } +} diff --git a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/label/AddEditDialoglTest.java b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/label/AddEditDialoglTest.java index b9a2565240..1f9667792d 100644 --- a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/label/AddEditDialoglTest.java +++ b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/label/AddEditDialoglTest.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -19,8 +19,8 @@ import static org.junit.Assert.*; import java.awt.Component; import java.awt.Window; +import java.util.ArrayList; import java.util.List; -import java.util.concurrent.atomic.AtomicReference; import javax.swing.*; @@ -86,11 +86,7 @@ public class AddEditDialoglTest extends AbstractGhidraHeadedIntegrationTest { } private AddEditDialog getAddEditDialog() { - AtomicReference ref = new AtomicReference<>(); - runSwing(() -> { - ref.set(plugin.getAddEditDialog()); - }); - return ref.get(); + return runSwing(() -> plugin.getAddEditDialog()); } @After @@ -106,7 +102,7 @@ public class AddEditDialoglTest extends AbstractGhidraHeadedIntegrationTest { assertEquals("", getText()); assertTrue(!entryCheckBox.isSelected()); - Namespace scope = getScope(); + Namespace scope = getSelectedNamespace(); assertEquals(globalScope, scope); assertTrue(primaryCheckBox.isSelected()); assertTrue(!primaryCheckBox.isEnabled()); @@ -195,42 +191,19 @@ public class AddEditDialoglTest extends AbstractGhidraHeadedIntegrationTest { Address address = addr(0x10065a6); Symbol symbol = st.createLabel(address, "sybmol1", scope4, SourceType.USER_DEFINED); - editLabel(symbol); - - JComboBox namespaceChoices = (JComboBox) getInstanceField("namespaceChoices", dialog); - - // get a list of all namespaces in order to compare with the values - // from the combo box - // the first item should always be the global namespace... - assertEquals("The first item in the list of namespaces is not the global namespace", - program.getGlobalNamespace(), getScope(0)); - - assertEquals("The symbol's namespace was not put into the proper place in the list.", - getScope(2), symbol.getParentNamespace()); - - // ...then, each namespace should be a child of the following - // namespace - int itemCount = namespaceChoices.getItemCount(); - for (int i = 1; i < itemCount - 1; i++) { - Namespace currentNamespace = getScope(i); - Namespace nextNamespace = getScope(i + 1); - Namespace actualParent = currentNamespace.getParentNamespace(); - - assertTrue("The namespaces are not in order in the " + - "namespaceChoices combo box. Each item should be a child of " + "following item.", - nextNamespace.equals(actualParent)); - } - - // finally, the last item should be parented on the global namespace - Namespace currentNamespace = getScope(itemCount - 1); - Namespace actualParent = currentNamespace.getParentNamespace(); - - assertTrue( - "The namespaces are not in order in the " + - "namespaceChoices combo box. Each item should be a child of " + "following item.", - actualParent.equals(program.getGlobalNamespace())); - program.endTransaction(transactionID, true); + + editLabel(symbol); + List comboNamespaces = getComboNamespaces(); + assertEquals(3, comboNamespaces.size()); + + // currently, combo is populated with: global, current symbol namespace, containing function + // namespace if in a function body, and then recently used (there are no recently used in + // this test) + assertEquals(program.getGlobalNamespace(), comboNamespaces.get(0)); + assertEquals(scope4, comboNamespaces.get(1)); + assertEquals(f, comboNamespaces.get(2)); + } @Test @@ -892,33 +865,23 @@ public class AddEditDialoglTest extends AbstractGhidraHeadedIntegrationTest { runSwing(() -> checkbox.setSelected(value)); } - private Namespace getScope() { - final AtomicReference ref = new AtomicReference<>(); - runSwing(() -> { + private Namespace getSelectedNamespace() { + return runSwing(() -> { Object selectedItem = namespacesComboBox.getSelectedItem(); - Namespace ns = ((AddEditDialog.NamespaceWrapper) selectedItem).getNamespace(); - ref.set(ns); + return ((AddEditDialog.NamespaceWrapper) selectedItem).getNamespace(); }); - return ref.get(); } - private Namespace getScope(final int index) { - final AtomicReference ref = new AtomicReference<>(); - runSwing(() -> { + private List getComboNamespaces() { + return runSwing(() -> { + List namespaces = new ArrayList<>(); int count = namespacesComboBox.getItemCount(); - if (count <= index) { - System.err.println("Available namespaces: "); - for (int i = 0; i < count; i++) { - System.err.println("\t" + namespacesComboBox.getItemAt(i)); - } - throw new IllegalArgumentException("No namespace at index: " + index); + for (int i = 0; i < count; i++) { + Object itemAt = namespacesComboBox.getItemAt(i); + namespaces.add(((AddEditDialog.NamespaceWrapper) itemAt).getNamespace()); } - - Object selectedItem = namespacesComboBox.getItemAt(index); - Namespace ns = ((AddEditDialog.NamespaceWrapper) selectedItem).getNamespace(); - ref.set(ns); + return namespaces; }); - return ref.get(); } private void setScope(final Namespace scope) { diff --git a/Ghidra/Features/Base/src/test/java/ghidra/app/util/NamespaceCacheTest.java b/Ghidra/Features/Base/src/test/java/ghidra/app/util/NamespaceCacheTest.java new file mode 100644 index 0000000000..c8a1f6d9ed --- /dev/null +++ b/Ghidra/Features/Base/src/test/java/ghidra/app/util/NamespaceCacheTest.java @@ -0,0 +1,126 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.app.util; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import generic.test.AbstractGuiTest; +import ghidra.program.database.ProgramBuilder; +import ghidra.program.database.ProgramDB; +import ghidra.program.model.symbol.Namespace; +import ghidra.program.model.symbol.SourceType; +import ghidra.test.ToyProgramBuilder; + +public class NamespaceCacheTest extends AbstractGuiTest { + + private Namespace a; + private Namespace b; + private Namespace c; + private Namespace d; + private Namespace e; + private Namespace f; + private Namespace g; + private Namespace h; + private Namespace i; + private Namespace j; + private Namespace k; + private ProgramDB program; + + @Before + public void setup() throws Exception { + ProgramBuilder builder = new ToyProgramBuilder("Test", false, this); + a = builder.createNamespace("a"); + b = builder.createNamespace("b", "a", SourceType.USER_DEFINED); + c = builder.createNamespace("c", "a::b", SourceType.USER_DEFINED); + d = builder.createNamespace("d"); + e = builder.createNamespace("e"); + f = builder.createNamespace("f"); + g = builder.createNamespace("g"); + h = builder.createNamespace("h"); + i = builder.createNamespace("i"); + j = builder.createNamespace("j"); + k = builder.createNamespace("k"); + program = builder.getProgram(); + } + + @Test + public void testGetRecent() { + NamespaceCache.add(program, a); + NamespaceCache.add(program, b); + NamespaceCache.add(program, c); + + List recent = NamespaceCache.get(program); + assertEquals(c, recent.get(0)); + assertEquals(b, recent.get(1)); + assertEquals(a, recent.get(2)); + } + + @Test + public void testMostRecentAtTop() { + NamespaceCache.add(program, a); + NamespaceCache.add(program, b); + NamespaceCache.add(program, c); + NamespaceCache.add(program, a); + + List recents = NamespaceCache.get(program); + assertEquals(3, recents.size()); + assertEquals(a, recents.get(0)); + assertEquals(c, recents.get(1)); + assertEquals(b, recents.get(2)); + } + + @Test + public void testMaxRecents() { + NamespaceCache.add(program, a); + NamespaceCache.add(program, b); + NamespaceCache.add(program, c); + NamespaceCache.add(program, d); + NamespaceCache.add(program, e); + NamespaceCache.add(program, f); + NamespaceCache.add(program, g); + NamespaceCache.add(program, h); + NamespaceCache.add(program, i); + NamespaceCache.add(program, j); + NamespaceCache.add(program, k); + + List recents = NamespaceCache.get(program); + assertEquals(NamespaceCache.MAX_RECENTS, recents.size()); + assertEquals(k, recents.get(0)); + assertEquals(b, recents.get(9)); + } + + @Test + public void testClosingProgramClearsRecents() { + NamespaceCache.add(program, a); + NamespaceCache.add(program, b); + NamespaceCache.add(program, c); + + List recents = NamespaceCache.get(program); + assertEquals(3, recents.size()); + + program.release(this); + + recents = NamespaceCache.get(program); + assertTrue(recents.isEmpty()); + + } + +} diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/util/datastruct/LRUSet.java b/Ghidra/Framework/Generic/src/main/java/ghidra/util/datastruct/LRUSet.java index c1d8870d57..57445bbba1 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/util/datastruct/LRUSet.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/util/datastruct/LRUSet.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,7 +15,7 @@ */ package ghidra.util.datastruct; -import java.util.Iterator; +import java.util.*; /** * An ordered set-like data structure. @@ -51,6 +51,13 @@ public class LRUSet extends LRUMap implements Iterable { @Override public String toString() { - return map.keySet().toString(); + return keySet().toString(); + } + + /** + * {@return a List of elements in this set} + */ + public List toList() { + return new ArrayList<>(keySet()); } } diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DataTypeEditorsScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DataTypeEditorsScreenShots.java index f1b5457697..b25eff8824 100644 --- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DataTypeEditorsScreenShots.java +++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/DataTypeEditorsScreenShots.java @@ -68,18 +68,6 @@ public class DataTypeEditorsScreenShots extends GhidraScreenShotGenerator { positionListingTop(0x40D3B8); DropDownSelectionTextField textField = showTypeChooserDialog(); - triggerText(textField, "undefined"); - - DialogComponentProvider dialog = getDialog(); - JComponent component = dialog.getComponent(); - Window dataTypeDialog = windowForComponent(component); - Window[] popUpWindows = dataTypeDialog.getOwnedWindows(); - - List dataTypeWindows = new ArrayList<>(Arrays.asList(popUpWindows)); - dataTypeWindows.add(dataTypeDialog); - - captureComponents(dataTypeWindows); - closeAllWindows(); } private DropDownSelectionTextField showTypeChooserDialog() throws Exception { diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/LabelMgrPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/LabelMgrPluginScreenShots.java index 5614090ee1..69f5dc025e 100644 --- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/LabelMgrPluginScreenShots.java +++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/LabelMgrPluginScreenShots.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -23,8 +23,7 @@ import org.junit.Test; import docking.widgets.combobox.GhidraComboBox; import ghidra.app.plugin.core.label.*; -import ghidra.app.util.AddEditDialog; -import ghidra.app.util.EditFieldNameDialog; +import ghidra.app.util.*; import ghidra.program.model.address.*; import ghidra.program.model.symbol.LabelHistory; @@ -76,11 +75,21 @@ public class LabelMgrPluginScreenShots extends GhidraScreenShotGenerator { captureDialog(); } + @Test + public void testChooseNamespace() { + runSwingLater(() -> { + NamespaceChooserDialog dialog = new NamespaceChooserDialog(); + dialog.getNameSpace(program); + }); + waitForDialogComponent(NamespaceChooserDialog.class); + captureDialog(); + } + @Test public void testSetLabel() { LabelMgrPlugin plugin = getPlugin(tool, LabelMgrPlugin.class); final OperandLabelDialog dialog = new OperandLabelDialog(plugin); - final GhidraComboBox combo = (GhidraComboBox) getInstanceField("myChoice", dialog); + final GhidraComboBox combo = (GhidraComboBox) getInstanceField("myChoice", dialog); runSwing(new Runnable() { @Override public void run() {